@@ -215,115 +215,164 @@ snd_sc1810c_get_status_field(struct usb_device *dev,
215215 */
216216static int snd_s1810c_init_mixer_maps (struct snd_usb_audio * chip )
217217{
218- u32 a , b , c , e , n , off ;
218+ u32 a , b , c , e , n , off , left , right ;
219219 struct usb_device * dev = chip -> dev ;
220220
221- /* Set initial volume levels ? */
222- a = 0x64 ;
223- e = 0xbc ;
224- for (n = 0 ; n < 2 ; n ++ ) {
225- off = n * 18 ;
226- for (b = off ; b < 18 + off ; b ++ ) {
227- /* This channel to all outputs ? */
228- for (c = 0 ; c <= 8 ; c ++ ) {
221+ switch (chip -> usb_id ) {
222+ case USB_ID (0x194f , 0x010c ): /* 1810c */
223+ /* Set initial volume levels ? */
224+ a = 0x64 ;
225+ e = 0xbc ;
226+ for (n = 0 ; n < 2 ; n ++ ) {
227+ off = n * 18 ;
228+ for (b = off ; b < 18 + off ; b ++ ) {
229+ /* This channel to all outputs ? */
230+ for (c = 0 ; c <= 8 ; c ++ ) {
231+ snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , e );
232+ snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , e );
233+ }
234+ /* This channel to main output (again) */
235+ snd_s1810c_send_ctl_packet (dev , a , b , 0 , 0 , e );
236+ snd_s1810c_send_ctl_packet (dev , a , b , 0 , 1 , e );
237+ }
238+ /*
239+ * I noticed on UC that DAW channels have different
240+ * initial volumes, so this makes sense.
241+ */
242+ e = 0xb53bf0 ;
243+ }
244+
245+ /* Connect analog outputs ? */
246+ a = 0x65 ;
247+ e = 0x01000000 ;
248+ for (b = 1 ; b < 3 ; b ++ ) {
249+ snd_s1810c_send_ctl_packet (dev , a , b , 0 , 0 , e );
250+ snd_s1810c_send_ctl_packet (dev , a , b , 0 , 1 , e );
251+ }
252+ snd_s1810c_send_ctl_packet (dev , a , 0 , 0 , 0 , e );
253+ snd_s1810c_send_ctl_packet (dev , a , 0 , 0 , 1 , e );
254+
255+ /* Set initial volume levels for S/PDIF mappings ? */
256+ a = 0x64 ;
257+ e = 0xbc ;
258+ c = 3 ;
259+ for (n = 0 ; n < 2 ; n ++ ) {
260+ off = n * 18 ;
261+ for (b = off ; b < 18 + off ; b ++ ) {
229262 snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , e );
230263 snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , e );
231264 }
232- /* This channel to main output (again) */
265+ e = 0xb53bf0 ;
266+ }
267+
268+ /* Connect S/PDIF output ? */
269+ a = 0x65 ;
270+ e = 0x01000000 ;
271+ snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 0 , e );
272+ snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 1 , e );
273+
274+ /* Connect all outputs (again) ? */
275+ a = 0x65 ;
276+ e = 0x01000000 ;
277+ for (b = 0 ; b < 4 ; b ++ ) {
233278 snd_s1810c_send_ctl_packet (dev , a , b , 0 , 0 , e );
234279 snd_s1810c_send_ctl_packet (dev , a , b , 0 , 1 , e );
235280 }
236- /*
237- * I noticed on UC that DAW channels have different
238- * initial volumes, so this makes sense.
239- */
240- e = 0xb53bf0 ;
241- }
242281
243- /* Connect analog outputs ? */
244- a = 0x65 ;
245- e = 0x01000000 ;
246- for (b = 1 ; b < 3 ; b ++ ) {
247- snd_s1810c_send_ctl_packet (dev , a , b , 0 , 0 , e );
248- snd_s1810c_send_ctl_packet (dev , a , b , 0 , 1 , e );
249- }
250- snd_s1810c_send_ctl_packet (dev , a , 0 , 0 , 0 , e );
251- snd_s1810c_send_ctl_packet (dev , a , 0 , 0 , 1 , e );
252-
253- /* Set initial volume levels for S/PDIF mappings ? */
254- a = 0x64 ;
255- e = 0xbc ;
256- c = 3 ;
257- for (n = 0 ; n < 2 ; n ++ ) {
258- off = n * 18 ;
259- for (b = off ; b < 18 + off ; b ++ ) {
260- snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , e );
261- snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , e );
282+ /* Basic routing to get sound out of the device */
283+ a = 0x64 ;
284+ e = 0x01000000 ;
285+ for (c = 0 ; c < 4 ; c ++ ) {
286+ for (b = 0 ; b < 36 ; b ++ ) {
287+ if ((c == 0 && b == 18 ) || /* DAW1/2 -> Main */
288+ (c == 1 && b == 20 ) || /* DAW3/4 -> Line3/4 */
289+ (c == 2 && b == 22 ) || /* DAW4/5 -> Line5/6 */
290+ (c == 3 && b == 24 )) { /* DAW5/6 -> S/PDIF */
291+ /* Left */
292+ snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , e );
293+ snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , 0 );
294+ b ++ ;
295+ /* Right */
296+ snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , 0 );
297+ snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , e );
298+ } else {
299+ /* Leave the rest disconnected */
300+ snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , 0 );
301+ snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , 0 );
302+ }
303+ }
262304 }
263- e = 0xb53bf0 ;
264- }
265305
266- /* Connect S/PDIF output ? */
267- a = 0x65 ;
268- e = 0x01000000 ;
269- snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 0 , e );
270- snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 1 , e );
271-
272- /* Connect all outputs (again) ? */
273- a = 0x65 ;
274- e = 0x01000000 ;
275- for (b = 0 ; b < 4 ; b ++ ) {
276- snd_s1810c_send_ctl_packet (dev , a , b , 0 , 0 , e );
277- snd_s1810c_send_ctl_packet (dev , a , b , 0 , 1 , e );
278- }
279-
280- /* Basic routing to get sound out of the device */
281- a = 0x64 ;
282- e = 0x01000000 ;
283- for (c = 0 ; c < 4 ; c ++ ) {
284- for (b = 0 ; b < 36 ; b ++ ) {
285- if ((c == 0 && b == 18 ) || /* DAW1/2 -> Main */
286- (c == 1 && b == 20 ) || /* DAW3/4 -> Line3/4 */
287- (c == 2 && b == 22 ) || /* DAW4/5 -> Line5/6 */
288- (c == 3 && b == 24 )) { /* DAW5/6 -> S/PDIF */
289- /* Left */
306+ /* Set initial volume levels for S/PDIF (again) ? */
307+ a = 0x64 ;
308+ e = 0xbc ;
309+ c = 3 ;
310+ for (n = 0 ; n < 2 ; n ++ ) {
311+ off = n * 18 ;
312+ for (b = off ; b < 18 + off ; b ++ ) {
290313 snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , e );
291- snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , 0 );
292- b ++ ;
293- /* Right */
294- snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , 0 );
295314 snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , e );
296- } else {
297- /* Leave the rest disconnected */
298- snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , 0 );
299- snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , 0 );
300315 }
316+ e = 0xb53bf0 ;
301317 }
302- }
303318
304- /* Set initial volume levels for S/PDIF (again) ? */
305- a = 0x64 ;
306- e = 0xbc ;
307- c = 3 ;
308- for (n = 0 ; n < 2 ; n ++ ) {
309- off = n * 18 ;
310- for (b = off ; b < 18 + off ; b ++ ) {
319+ /* Connect S/PDIF outputs (again) ? */
320+ a = 0x65 ;
321+ e = 0x01000000 ;
322+ snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 0 , e );
323+ snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 1 , e );
324+
325+ /* Again ? */
326+ snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 0 , e );
327+ snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 1 , e );
328+ break ;
329+
330+ case USB_ID (0x194f , 0x010d ): /* 1824c */
331+ /* Set all output faders to unity gain */
332+ a = 0x65 ;
333+ c = 0x00 ;
334+ e = 0x01000000 ;
335+
336+ for (b = 0 ; b < 9 ; b ++ ) {
311337 snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , e );
312338 snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , e );
313339 }
314- e = 0xb53bf0 ;
315- }
316-
317- /* Connect S/PDIF outputs (again) ? */
318- a = 0x65 ;
319- e = 0x01000000 ;
320- snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 0 , e );
321- snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 1 , e );
322-
323- /* Again ? */
324- snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 0 , e );
325- snd_s1810c_send_ctl_packet (dev , a , 3 , 0 , 1 , e );
326340
341+ /* Set
342+ * Daw 1 -> Line out 1 (left), Daw 2 -> Line out 2 (right)
343+ * Daw 3 -> Line out 3, (left) Daw 4 -> Line out 4 (right)
344+ * Daw 5 -> Line out 5, (left) Daw 6 -> Line out 6 (right)
345+ * Daw 7 -> Line out 7, (left) Daw 8 -> Line out 8 (right)
346+ * Daw 9 -> SPDIF out 1, (left) Daw 10 -> SPDIF out 2 (right)
347+ * Daw 11 -> ADAT out 1, (left) Daw 12 -> ADAT out 2 (right)
348+ * Daw 13 -> ADAT out 3, (left) Daw 14 -> ADAT out 4 (right)
349+ * Daw 15 -> ADAT out 5, (left) Daw 16 -> ADAT out 6 (right)
350+ * Daw 17 -> ADAT out 7, (left) Daw 18 -> ADAT out 8 (right)
351+ * Everything else muted
352+ */
353+ a = 0x64 ;
354+ /* The first Daw channel is channel 18 */
355+ left = 18 ;
356+
357+ for (c = 0 ; c < 9 ; c ++ ) {
358+ right = left + 1 ;
359+
360+ for (b = 0 ; b < 36 ; b ++ ) {
361+ if (b == left ) {
362+ snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , 0x01000000 );
363+ snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , 0x00 );
364+ } else if (b == right ) {
365+ snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , 0x00 );
366+ snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , 0x01000000 );
367+ } else {
368+ snd_s1810c_send_ctl_packet (dev , a , b , c , 0 , 0x00 );
369+ snd_s1810c_send_ctl_packet (dev , a , b , c , 1 , 0x00 );
370+ }
371+ }
372+ left += 2 ;
373+ }
374+ break ;
375+ }
327376 return 0 ;
328377}
329378
0 commit comments