Skip to content

Commit d872390

Browse files
committed
bgm_xyscope: simplify alsa probing
1 parent fc11028 commit d872390

File tree

1 file changed

+43
-77
lines changed

1 file changed

+43
-77
lines changed

src/modules/bgm_xyscope.c

Lines changed: 43 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,12 @@ enum samplesize {
3030

3131
static snd_pcm_t * scope_pcm;
3232
// Details on the sample format before conversion.
33-
// Two-channel (enables XY mode), if not, acts like a primitive X oscilloscope
34-
static int sf_2c;
33+
// channel count - 2 enables XY mode, 1 acts like a primitive X oscilloscope
34+
static int sf_chancount;
35+
// xy mode, uses two channels
36+
static int sf_usey;
3537
static enum samplesize sf_sampsize;
3638
static int sf_us;
37-
static int sf_usey;
3839
static int sf_forceon;
3940

4041
static int camera_width;
@@ -62,10 +63,10 @@ static oscore_task scope_task;
6263
#define SM_ALGORITHM(sample, shr, sub) (((byte) (sample >> shr)) - sub)
6364
#define LD_ALGORITHM(typ, shr, sub) \
6465
for (int indx = 0; indx < BUFFER_FRAMES; indx++) { \
65-
typ sampleA = ((typ *) bufferA)[indx * (sf_2c ? 2 : 1)]; \
66+
typ sampleA = ((typ *) bufferA)[indx * sf_chancount]; \
6667
bufferB[indx * 2] = SM_ALGORITHM(sampleA, shr, sub); \
67-
if (sf_2c && sf_usey) { \
68-
typ sampleB = ((typ *) bufferA)[(indx * (sf_2c ? 2 : 1)) + 1]; \
68+
if (sf_chancount == 2 && sf_usey) { \
69+
typ sampleB = ((typ *) bufferA)[(indx * sf_chancount) + 1]; \
6970
bufferB[(indx * 2) + 1] = 255 - SM_ALGORITHM(sampleB, shr, sub); \
7071
} else { \
7172
bufferB[(indx * 2) + 1] = bufferB[indx * 2]; \
@@ -246,97 +247,62 @@ int init(int modulen, char* argstr) {
246247
return 1;
247248
}
248249
free(ourarg);
249-
sf_2c = 0;
250+
250251
sf_sampsize = SIZE_8;
251252
sf_us = 0;
252-
if (sf_usey) {
253-
if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S8, SND_PCM_ACCESS_RW_INTERLEAVED, 2, SAMPLE_RATE, 1, 1000))) {
254-
printf("Got BS8C2\n");
255-
sf_2c = 1;
256-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S16, SND_PCM_ACCESS_RW_INTERLEAVED, 2, SAMPLE_RATE, 1, 1000))) {
257-
printf("Got BS16C2\n");
258-
sf_sampsize = SIZE_16;
259-
sf_2c = 1;
260-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S24, SND_PCM_ACCESS_RW_INTERLEAVED, 2, SAMPLE_RATE, 1, 1000))) {
261-
printf("Got BS24C2\n");
262-
sf_sampsize = SIZE_24;
263-
sf_2c = 1;
264-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S32, SND_PCM_ACCESS_RW_INTERLEAVED, 2, SAMPLE_RATE, 1, 1000))) {
265-
printf("Got BS32C2\n");
266-
sf_sampsize = SIZE_32;
267-
sf_2c = 1;
268-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U8, SND_PCM_ACCESS_RW_INTERLEAVED, 2, SAMPLE_RATE, 1, 1000))) {
269-
printf("Got BU8C2\n");
270-
sf_2c = 1;
271-
sf_us = 1;
272-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U16, SND_PCM_ACCESS_RW_INTERLEAVED, 2, SAMPLE_RATE, 1, 1000))) {
273-
printf("Got BU16C2\n");
274-
sf_sampsize = SIZE_16;
275-
sf_2c = 1;
276-
sf_us = 1;
277-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U24, SND_PCM_ACCESS_RW_INTERLEAVED, 2, SAMPLE_RATE, 1, 1000))) {
278-
printf("Got BU24C2\n");
279-
sf_sampsize = SIZE_24;
280-
sf_2c = 1;
281-
sf_us = 1;
282-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U32, SND_PCM_ACCESS_RW_INTERLEAVED, 2, SAMPLE_RATE, 1, 1000))) {
283-
printf("Got BU32C2\n");
284-
sf_sampsize = SIZE_32;
285-
sf_2c = 1;
286-
sf_us = 1;
287-
}
253+
sf_chancount = sf_usey ? 2 : 1;
254+
255+
if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S8, SND_PCM_ACCESS_RW_INTERLEAVED, sf_chancount, SAMPLE_RATE, 1, 1000))) {
256+
sf_sampsize = SIZE_8;
257+
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S16, SND_PCM_ACCESS_RW_INTERLEAVED, sf_chancount, SAMPLE_RATE, 1, 1000))) {
258+
sf_sampsize = SIZE_16;
259+
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S24, SND_PCM_ACCESS_RW_INTERLEAVED, sf_chancount, SAMPLE_RATE, 1, 1000))) {
260+
sf_sampsize = SIZE_24;
261+
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S32, SND_PCM_ACCESS_RW_INTERLEAVED, sf_chancount, SAMPLE_RATE, 1, 1000))) {
262+
sf_sampsize = SIZE_32;
263+
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U8, SND_PCM_ACCESS_RW_INTERLEAVED, sf_chancount, SAMPLE_RATE, 1, 1000))) {
264+
sf_sampsize = SIZE_8;
265+
sf_us = 1;
266+
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U16, SND_PCM_ACCESS_RW_INTERLEAVED, sf_chancount, SAMPLE_RATE, 1, 1000))) {
267+
sf_sampsize = SIZE_16;
268+
sf_us = 1;
269+
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U24, SND_PCM_ACCESS_RW_INTERLEAVED, sf_chancount, SAMPLE_RATE, 1, 1000))) {
270+
sf_sampsize = SIZE_24;
271+
sf_us = 1;
272+
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U32, SND_PCM_ACCESS_RW_INTERLEAVED, sf_chancount, SAMPLE_RATE, 1, 1000))) {
273+
sf_sampsize = SIZE_32;
274+
sf_us = 1;
288275
} else {
289-
if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S8, SND_PCM_ACCESS_RW_INTERLEAVED, 1, SAMPLE_RATE, 1, 1000))) {
290-
printf("Got BS8C1\n");
291-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S16, SND_PCM_ACCESS_RW_INTERLEAVED, 1, SAMPLE_RATE, 1, 1000))) {
292-
printf("Got BS16C1\n");
293-
sf_sampsize = SIZE_16;
294-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S24, SND_PCM_ACCESS_RW_INTERLEAVED, 1, SAMPLE_RATE, 1, 1000))) {
295-
printf("Got BS24C1\n");
296-
sf_sampsize = SIZE_24;
297-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_S32, SND_PCM_ACCESS_RW_INTERLEAVED, 1, SAMPLE_RATE, 1, 1000))) {
298-
printf("Got BS32C1\n");
299-
sf_sampsize = SIZE_32;
300-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U8, SND_PCM_ACCESS_RW_INTERLEAVED, 1, SAMPLE_RATE, 1, 1000))) {
301-
printf("Got BU8C1\n");
302-
sf_us = 1;
303-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U16, SND_PCM_ACCESS_RW_INTERLEAVED, 1, SAMPLE_RATE, 1, 1000))) {
304-
printf("Got BU16C1\n");
305-
sf_sampsize = SIZE_16;
306-
sf_us = 1;
307-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U24, SND_PCM_ACCESS_RW_INTERLEAVED, 1, SAMPLE_RATE, 1, 1000))) {
308-
printf("Got BU24C1\n");
309-
sf_sampsize = SIZE_24;
310-
sf_us = 1;
311-
} else if (!(code = snd_pcm_set_params(scope_pcm, SND_PCM_FORMAT_U32, SND_PCM_ACCESS_RW_INTERLEAVED, 1, SAMPLE_RATE, 1, 1000))) {
312-
printf("Got BU32C1\n");
313-
sf_sampsize = SIZE_32;
314-
sf_us = 1;
315-
} else {
316-
printf("Couldn't convince ALSA to give sane settings: %i\n", code);
317-
snd_pcm_close(scope_pcm);
318-
free(bufferC);
319-
return 1;
320-
}
276+
printf("Couldn't convince ALSA to give sane settings: %i\n", code);
277+
snd_pcm_close(scope_pcm);
278+
free(bufferC);
279+
return 1;
321280
}
322281

323-
int bytesPerSample = 1;
282+
int bytesPerSample;
283+
int bitsPerSample;
324284
switch (sf_sampsize) {
325285
case SIZE_8:
326286
bytesPerSample = 1;
287+
bitsPerSample = 8;
327288
break;
328289
case SIZE_16:
329290
bytesPerSample = 2;
291+
bitsPerSample = 16;
330292
break;
331293
case SIZE_24:
332294
bytesPerSample = 3;
295+
bitsPerSample = 24;
333296
break;
334297
case SIZE_32:
335298
bytesPerSample = 4;
299+
bitsPerSample = 32;
336300
break;
337301
}
338302

339-
bufferA = malloc(BUFFER_FRAMES * (sf_2c ? 2 : 1) * bytesPerSample);
303+
printf("Got B%c%dC%d\n", sf_us ? 'U' : 'S', bitsPerSample, sf_chancount);
304+
305+
bufferA = malloc(BUFFER_FRAMES * sf_chancount * bytesPerSample);
340306
if (!bufferA) {
341307
printf("Couldn't allocate working buffer\n");
342308
snd_pcm_close(scope_pcm);

0 commit comments

Comments
 (0)