fix ALSA driver for Raspberry PI
This commit is contained in:
parent
2a0c78d526
commit
d0f2d7425e
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue