@@ -12,6 +12,10 @@ struct fw_spkr {
12
12
s16 volume [6 ];
13
13
s16 volume_min ;
14
14
s16 volume_max ;
15
+
16
+ unsigned int mixer_channels ;
17
+ u8 mute_fb_id ;
18
+ u8 volume_fb_id ;
15
19
};
16
20
17
21
enum control_action { CTL_READ , CTL_WRITE };
@@ -162,8 +166,8 @@ static int spkr_mute_put(struct snd_kcontrol *control,
162
166
if (mute == spkr -> mute )
163
167
return 0 ;
164
168
165
- err = avc_audio_feature_mute (oxfw -> unit , oxfw -> device_info -> mute_fb_id ,
166
- & mute , CTL_WRITE );
169
+ err = avc_audio_feature_mute (oxfw -> unit , spkr -> mute_fb_id , & mute ,
170
+ CTL_WRITE );
167
171
if (err < 0 )
168
172
return err ;
169
173
spkr -> mute = mute ;
@@ -178,7 +182,7 @@ static int spkr_volume_info(struct snd_kcontrol *control,
178
182
struct fw_spkr * spkr = oxfw -> spec ;
179
183
180
184
info -> type = SNDRV_CTL_ELEM_TYPE_INTEGER ;
181
- info -> count = oxfw -> device_info -> mixer_channels ;
185
+ info -> count = spkr -> mixer_channels ;
182
186
info -> value .integer .min = spkr -> volume_min ;
183
187
info -> value .integer .max = spkr -> volume_max ;
184
188
@@ -194,7 +198,7 @@ static int spkr_volume_get(struct snd_kcontrol *control,
194
198
struct fw_spkr * spkr = oxfw -> spec ;
195
199
unsigned int i ;
196
200
197
- for (i = 0 ; i < oxfw -> device_info -> mixer_channels ; ++ i )
201
+ for (i = 0 ; i < spkr -> mixer_channels ; ++ i )
198
202
value -> value .integer .value [channel_map [i ]] = spkr -> volume [i ];
199
203
200
204
return 0 ;
@@ -210,7 +214,7 @@ static int spkr_volume_put(struct snd_kcontrol *control,
210
214
s16 volume ;
211
215
int err ;
212
216
213
- for (i = 0 ; i < oxfw -> device_info -> mixer_channels ; ++ i ) {
217
+ for (i = 0 ; i < spkr -> mixer_channels ; ++ i ) {
214
218
if (value -> value .integer .value [i ] < spkr -> volume_min ||
215
219
value -> value .integer .value [i ] > spkr -> volume_max )
216
220
return - EINVAL ;
@@ -220,20 +224,19 @@ static int spkr_volume_put(struct snd_kcontrol *control,
220
224
}
221
225
222
226
changed_channels = 0 ;
223
- for (i = 0 ; i < oxfw -> device_info -> mixer_channels ; ++ i )
227
+ for (i = 0 ; i < spkr -> mixer_channels ; ++ i )
224
228
if (value -> value .integer .value [channel_map [i ]] !=
225
229
spkr -> volume [i ])
226
230
changed_channels |= 1 << (i + 1 );
227
231
228
232
if (equal_values && changed_channels != 0 )
229
233
changed_channels = 1 << 0 ;
230
234
231
- for (i = 0 ; i <= oxfw -> device_info -> mixer_channels ; ++ i ) {
235
+ for (i = 0 ; i <= spkr -> mixer_channels ; ++ i ) {
232
236
volume = value -> value .integer .value [channel_map [i ? i - 1 : 0 ]];
233
237
if (changed_channels & (1 << i )) {
234
238
err = avc_audio_feature_volume (oxfw -> unit ,
235
- oxfw -> device_info -> mute_fb_id ,
236
- & volume ,
239
+ spkr -> volume_fb_id , & volume ,
237
240
i , CTL_CURRENT , CTL_WRITE );
238
241
if (err < 0 )
239
242
return err ;
@@ -245,7 +248,7 @@ static int spkr_volume_put(struct snd_kcontrol *control,
245
248
return changed_channels != 0 ;
246
249
}
247
250
248
- int snd_oxfw_add_spkr (struct snd_oxfw * oxfw )
251
+ int snd_oxfw_add_spkr (struct snd_oxfw * oxfw , bool is_lacie )
249
252
{
250
253
static const struct snd_kcontrol_new controls [] = {
251
254
{
@@ -272,30 +275,35 @@ int snd_oxfw_add_spkr(struct snd_oxfw *oxfw)
272
275
return - ENOMEM ;
273
276
oxfw -> spec = spkr ;
274
277
275
- err = avc_audio_feature_volume (oxfw -> unit ,
276
- oxfw -> device_info -> volume_fb_id ,
277
- & spkr -> volume_min ,
278
- 0 , CTL_MIN , CTL_READ );
278
+ if (is_lacie ) {
279
+ spkr -> mixer_channels = 1 ;
280
+ spkr -> mute_fb_id = 0x01 ;
281
+ spkr -> volume_fb_id = 0x01 ;
282
+ } else {
283
+ spkr -> mixer_channels = 6 ;
284
+ spkr -> mute_fb_id = 0x01 ;
285
+ spkr -> volume_fb_id = 0x02 ;
286
+ }
287
+
288
+ err = avc_audio_feature_volume (oxfw -> unit , spkr -> volume_fb_id ,
289
+ & spkr -> volume_min , 0 , CTL_MIN , CTL_READ );
279
290
if (err < 0 )
280
291
return err ;
281
- err = avc_audio_feature_volume (oxfw -> unit ,
282
- oxfw -> device_info -> volume_fb_id ,
283
- & spkr -> volume_max ,
284
- 0 , CTL_MAX , CTL_READ );
292
+ err = avc_audio_feature_volume (oxfw -> unit , spkr -> volume_fb_id ,
293
+ & spkr -> volume_max , 0 , CTL_MAX , CTL_READ );
285
294
if (err < 0 )
286
295
return err ;
287
296
288
- err = avc_audio_feature_mute (oxfw -> unit , oxfw -> device_info -> mute_fb_id ,
289
- & spkr -> mute , CTL_READ );
297
+ err = avc_audio_feature_mute (oxfw -> unit , spkr -> mute_fb_id , & spkr -> mute ,
298
+ CTL_READ );
290
299
if (err < 0 )
291
300
return err ;
292
301
293
- first_ch = oxfw -> device_info -> mixer_channels == 1 ? 0 : 1 ;
294
- for (i = 0 ; i < oxfw -> device_info -> mixer_channels ; ++ i ) {
295
- err = avc_audio_feature_volume (oxfw -> unit ,
296
- oxfw -> device_info -> volume_fb_id ,
297
- & spkr -> volume [i ],
298
- first_ch + i , CTL_CURRENT , CTL_READ );
302
+ first_ch = spkr -> mixer_channels == 1 ? 0 : 1 ;
303
+ for (i = 0 ; i < spkr -> mixer_channels ; ++ i ) {
304
+ err = avc_audio_feature_volume (oxfw -> unit , spkr -> volume_fb_id ,
305
+ & spkr -> volume [i ], first_ch + i ,
306
+ CTL_CURRENT , CTL_READ );
299
307
if (err < 0 )
300
308
return err ;
301
309
}
0 commit comments