Skip to content

Commit 0ca2901

Browse files
royvegardtiwai
authored andcommitted
ALSA: usb-audio: add the initial mix for Presonus Studio 1824c
A reasonable initial mix for the 1824c is the one that Presonus Universal Control calls bypass. It mutes all the physical inputs, and connects Daw channel 1 to Line out channel 1 (left) Daw channel 2 to Line out channel 2 (right) Daw channel 3 to Line out channel 3 (left) etc. To get the most out of the 1824c a mixer application like Universal Control is needed. One is available for linux Link: https://github.com/royvegard/baton Signed-off-by: Roy Vegard Ovesen <roy.vegard.ovesen@gmail.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
1 parent eb379c3 commit 0ca2901

File tree

1 file changed

+138
-89
lines changed

1 file changed

+138
-89
lines changed

sound/usb/mixer_s1810c.c

Lines changed: 138 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -215,115 +215,164 @@ snd_sc1810c_get_status_field(struct usb_device *dev,
215215
*/
216216
static 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

Comments
 (0)