fix ALSA driver for Raspberry PI

This commit is contained in:
cnlohr 2018-12-08 22:11:48 -05:00
parent 2a0c78d526
commit d0f2d7425e

View file

@ -18,6 +18,7 @@ struct SoundDriverAlsa
int spsPlay; int spsPlay;
int channelsRec; int channelsRec;
int spsRec; int spsRec;
int alsa_fmt_s16le;
snd_pcm_uframes_t buffer; snd_pcm_uframes_t buffer;
og_thread_t thread; og_thread_t thread;
@ -51,7 +52,7 @@ void CloseSoundAlsa( struct SoundDriverAlsa * r )
} }
static int SetHWParams( snd_pcm_t * handle, int * samplerate, int * channels, snd_pcm_uframes_t * buffer ) static int SetHWParams( snd_pcm_t * handle, int * samplerate, int * channels, snd_pcm_uframes_t * buffer, struct SoundDriverAlsa * a )
{ {
int err; int err;
snd_pcm_hw_params_t *hw_params; snd_pcm_hw_params_t *hw_params;
@ -76,7 +77,15 @@ static int SetHWParams( snd_pcm_t * handle, int * samplerate, int * channels, sn
if ((err = snd_pcm_hw_params_set_format (handle, hw_params, SND_PCM_FORMAT_FLOAT )) < 0) { if ((err = snd_pcm_hw_params_set_format (handle, hw_params, SND_PCM_FORMAT_FLOAT )) < 0) {
fprintf (stderr, "cannot set sample format (%s)\n", fprintf (stderr, "cannot set sample format (%s)\n",
snd_strerror (err)); snd_strerror (err));
goto fail;
printf( "Trying backup: S16LE.\n" );
if ((err = snd_pcm_hw_params_set_format (handle, hw_params, SND_PCM_FORMAT_S16_LE )) < 0) {
fprintf (stderr, "cannot set sample format (%s)\n",
snd_strerror (err));
goto fail;
}
a->alsa_fmt_s16le = 1;
} }
if ((err = snd_pcm_hw_params_set_rate_near (handle, hw_params, (unsigned int*)samplerate, 0)) < 0) { if ((err = snd_pcm_hw_params_set_rate_near (handle, hw_params, (unsigned int*)samplerate, 0)) < 0) {
@ -208,6 +217,18 @@ static void * SoundThread( void * v )
} }
} }
if( a->alsa_fmt_s16le )
{
//Hacky: Turns out data was s16le.
int16_t * dat = (int16_t*)bufr[i];
float * dot = bufr[i];
int i;
int len = a->buffer;
for( i = len-1; i >= 0; i-- )
{
dot[i] = dat[i]/32768.0;
}
}
//Do our callback. //Do our callback.
int playbacksamples = 0; int playbacksamples = 0;
a->callback( bufp[i], bufr[i], a->buffer, &playbacksamples, (struct SoundDriver*)a ); a->callback( bufp[i], bufr[i], a->buffer, &playbacksamples, (struct SoundDriver*)a );
@ -276,7 +297,7 @@ static struct SoundDriverAlsa * InitASound( struct SoundDriverAlsa * r )
if( r->playback_handle ) if( r->playback_handle )
{ {
if( SetHWParams( r->playback_handle, &r->spsPlay, &r->channelsPlay, &r->buffer ) < 0 ) if( SetHWParams( r->playback_handle, &r->spsPlay, &r->channelsPlay, &r->buffer, r ) < 0 )
goto fail; goto fail;
if( SetSWParams( r->playback_handle, 0 ) < 0 ) if( SetSWParams( r->playback_handle, 0 ) < 0 )
goto fail; goto fail;
@ -284,7 +305,7 @@ static struct SoundDriverAlsa * InitASound( struct SoundDriverAlsa * r )
if( r->record_handle ) if( r->record_handle )
{ {
if( SetHWParams( r->record_handle, &r->spsRec, &r->channelsRec, &r->buffer ) < 0 ) if( SetHWParams( r->record_handle, &r->spsRec, &r->channelsRec, &r->buffer, r ) < 0 )
goto fail; goto fail;
if( SetSWParams( r->record_handle, 1 ) < 0 ) if( SetSWParams( r->record_handle, 1 ) < 0 )
goto fail; goto fail;
@ -332,6 +353,7 @@ void * InitSoundAlsa( SoundCBType cb )
r->record_handle = 0; r->record_handle = 0;
r->buffer = GetParameterI( "buffer", 1024 ); r->buffer = GetParameterI( "buffer", 1024 );
r->alsa_fmt_s16le = 0;
return InitASound(r); return InitASound(r);