@@ -30,11 +30,12 @@ enum samplesize {
3030
3131static 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 ;
3537static enum samplesize sf_sampsize ;
3638static int sf_us ;
37- static int sf_usey ;
3839static int sf_forceon ;
3940
4041static 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