simpleaudio: S16 format handling for backends

This commit is contained in:
Kamal Mostafa 2012-08-12 15:39:04 -07:00
parent a65a20d274
commit 6671138471
3 changed files with 67 additions and 13 deletions

View File

@ -115,11 +115,22 @@ sa_alsa_open_stream(
return 0;
}
assert( sa_format == SA_SAMPLE_FORMAT_FLOAT );
snd_pcm_format_t pcm_format;
switch ( sa->format ) {
case SA_SAMPLE_FORMAT_FLOAT:
pcm_format = SND_PCM_FORMAT_FLOAT;
break;
case SA_SAMPLE_FORMAT_S16:
pcm_format = SND_PCM_FORMAT_S16;
break;
default:
assert(0);
}
/* set up ALSA hardware params */
error = snd_pcm_set_params(pcm,
SND_PCM_FORMAT_FLOAT,
pcm_format,
SND_PCM_ACCESS_RW_INTERLEAVED,
channels,
rate,

View File

@ -92,11 +92,22 @@ sa_pulse_open_stream(
// FIXME - use source for something
// just take the default pulseaudio source for now
assert( sa_format == SA_SAMPLE_FORMAT_FLOAT );
pa_sample_format_t pa_format;
switch ( sa->format ) {
case SA_SAMPLE_FORMAT_FLOAT:
pa_format = PA_SAMPLE_FLOAT32;
break;
case SA_SAMPLE_FORMAT_S16:
pa_format = PA_SAMPLE_S16LE; // FIXME: handle S16BE
break;
default:
assert(0);
}
/* The sample type to use */
pa_sample_spec ss = {
.format = PA_SAMPLE_FLOAT32,
.format = pa_format,
.rate = rate,
.channels = channels,
};

View File

@ -44,12 +44,23 @@ sa_sndfile_read( simpleaudio *sa, void *buf, size_t nframes )
{
SNDFILE *s = (SNDFILE *)sa->backend_handle;
int n;
if ((n = sf_readf_float(s, buf, nframes)) < 0) {
fprintf(stderr, "sf_read_float: ");
switch ( sa->format ) {
case SA_SAMPLE_FORMAT_FLOAT:
n = sf_readf_float(s, buf, nframes);
break;
case SA_SAMPLE_FORMAT_S16:
n = sf_readf_short(s, buf, nframes);
break;
default:
assert(0);
break;
}
if ( n < 0 ) {
fprintf(stderr, "sf_read: ");
sf_perror(s);
return -1;
}
//fprintf(stderr, "sf_readf_float: nframes=%ld n=%d\n", nframes, n);
// fprintf(stderr, "sf_read: nframes=%ld n=%d\n", nframes, n);
return n;
}
@ -57,11 +68,22 @@ sa_sndfile_read( simpleaudio *sa, void *buf, size_t nframes )
static ssize_t
sa_sndfile_write( simpleaudio *sa, void *buf, size_t nframes )
{
//fprintf(stderr, "sf_writef_float: nframes=%ld\n", nframes);
// fprintf(stderr, "sf_write: nframes=%ld\n", nframes);
SNDFILE *s = (SNDFILE *)sa->backend_handle;
int n;
if ((n = sf_writef_float(s, buf, nframes)) < 0) {
fprintf(stderr, "sf_read_float: ");
switch ( sa->format ) {
case SA_SAMPLE_FORMAT_FLOAT:
n = sf_writef_float(s, buf, nframes);
break;
case SA_SAMPLE_FORMAT_S16:
n = sf_writef_short(s, buf, nframes);
break;
default:
assert(0);
break;
}
if ( n < 0 ) {
fprintf(stderr, "sf_write: ");
sf_perror(s);
return -1;
}
@ -135,17 +157,27 @@ sa_sndfile_open_stream(
{
const char *path = stream_name;
assert( sa_format == SA_SAMPLE_FORMAT_FLOAT );
int sf_format;
switch ( sa->format ) {
case SA_SAMPLE_FORMAT_FLOAT:
sf_format = SF_FORMAT_FLOAT;
break;
case SA_SAMPLE_FORMAT_S16:
sf_format = SF_FORMAT_PCM_16;
break;
default:
assert(0);
}
/* setting for SA_STREAM_PLAYBACK (file write) */
SF_INFO sfinfo = {
.format = 0,
.format = sf_format,
.samplerate = rate,
.channels = channels,
};
if ( sa_stream_direction == SA_STREAM_PLAYBACK )
sfinfo.format = sndfile_format_from_path(path) | SF_FORMAT_PCM_16;
sfinfo.format = sndfile_format_from_path(path) | sf_format;
/* Create the recording stream */
SNDFILE *s;