default sample rate is not as important as I thought

This commit is contained in:
Andrew Kelley 2015-07-08 00:42:17 -07:00
parent c39c1ab9f4
commit c760bc4df7
8 changed files with 29 additions and 21 deletions

View file

@ -115,8 +115,6 @@ view `coverage/index.html` in a browser.
## Roadmap
0. ALSA `list_devices` should list default, dmix, etc.
0. ALSA default devices are "default" and "default" respectively
0. implement ALSA (Linux) backend, get examples working
0. pipe record to playback example working with dummy linux, osx, windows
0. pipe record to playback example working with pulseaudio linux

View file

@ -79,11 +79,11 @@ int main(int argc, char **argv) {
double latency = 0.1;
struct SoundIoInputDevice *input_device;
soundio_input_device_create(in_device, SoundIoSampleFormatFloat, latency, NULL,
soundio_input_device_create(in_device, SoundIoSampleFormatFloat, 48000, latency, NULL,
read_callback, &input_device);
struct SoundIoOutputDevice *output_device;
soundio_output_device_create(out_device, SoundIoSampleFormatFloat, latency, NULL,
soundio_output_device_create(out_device, SoundIoSampleFormatFloat, 48000, latency, NULL,
write_callback, underrun_callback, &output_device);
if ((err = soundio_input_device_start(input_device)))

View file

@ -30,7 +30,7 @@ static float seconds_offset = 0.0f;
static void write_callback(struct SoundIoOutputDevice *output_device, int requested_frame_count) {
//device->bytes_per_frame;
float float_sample_rate = output_device->device->default_sample_rate;
float float_sample_rate = output_device->sample_rate;
float seconds_per_frame = 1.0f / float_sample_rate;
while (requested_frame_count > 0) {
@ -90,8 +90,8 @@ int main(int argc, char **argv) {
soundio_device_description(device));
struct SoundIoOutputDevice *output_device;
soundio_output_device_create(device, SoundIoSampleFormatFloat, 0.1, NULL,
write_callback, underrun_callback, &output_device);
soundio_output_device_create(device, SoundIoSampleFormatFloat, 48000,
0.1, NULL, write_callback, underrun_callback, &output_device);
if ((err = soundio_output_device_start(output_device)))
panic("unable to start device: %s", soundio_error_string(err));

View file

@ -35,13 +35,12 @@ struct SoundIoDummy {
static void playback_thread_run(void *arg) {
SoundIoOutputDevice *output_device = (SoundIoOutputDevice *)arg;
SoundIoDevice *device = output_device->device;
SoundIoOutputDeviceDummy *opd = (SoundIoOutputDeviceDummy *)output_device->backend_data;
double start_time = soundio_os_get_time();
long frames_consumed = 0;
double time_per_frame = 1.0 / (double)device->default_sample_rate;
double time_per_frame = 1.0 / (double)output_device->sample_rate;
while (opd->abort_flag.test_and_set()) {
soundio_os_cond_timed_wait(opd->cond, nullptr, opd->period);
@ -143,8 +142,7 @@ static int output_device_init_dummy(SoundIo *soundio,
}
output_device->backend_data = opd;
SoundIoDevice *device = output_device->device;
int buffer_frame_count = output_device->latency * device->default_sample_rate;
int buffer_frame_count = output_device->latency * output_device->sample_rate;
opd->buffer_size = output_device->bytes_per_frame * buffer_frame_count;
opd->period = output_device->latency * 0.5;

View file

@ -581,7 +581,7 @@ static int output_device_init_pa(SoundIo *soundio,
pa_sample_spec sample_spec;
sample_spec.format = to_pulseaudio_sample_format(output_device->sample_format);
sample_spec.rate = device->default_sample_rate;
sample_spec.rate = output_device->sample_rate;
sample_spec.channels = device->channel_layout.channel_count;
pa_channel_map channel_map = to_pulseaudio_channel_map(&device->channel_layout);
@ -595,7 +595,7 @@ static int output_device_init_pa(SoundIo *soundio,
pa_stream_set_write_callback(opd->stream, playback_stream_write_callback, output_device);
pa_stream_set_underflow_callback(opd->stream, playback_stream_underflow_callback, output_device);
int bytes_per_second = output_device->bytes_per_frame * device->default_sample_rate;
int bytes_per_second = output_device->bytes_per_frame * output_device->sample_rate;
int buffer_length = output_device->bytes_per_frame *
ceil(output_device->latency * bytes_per_second / (double)output_device->bytes_per_frame);
@ -747,7 +747,7 @@ static int input_device_init_pa(SoundIo *soundio,
pa_sample_spec sample_spec;
sample_spec.format = to_pulseaudio_sample_format(input_device->sample_format);
sample_spec.rate = device->default_sample_rate;
sample_spec.rate = input_device->sample_rate;
sample_spec.channels = device->channel_layout.channel_count;
pa_channel_map channel_map = to_pulseaudio_channel_map(&device->channel_layout);
@ -764,7 +764,7 @@ static int input_device_init_pa(SoundIo *soundio,
pa_stream_set_state_callback(stream, recording_stream_state_callback, input_device);
pa_stream_set_read_callback(stream, recording_stream_read_callback, input_device);
int bytes_per_second = input_device->bytes_per_frame * device->default_sample_rate;
int bytes_per_second = input_device->bytes_per_frame * input_device->sample_rate;
int buffer_length = input_device->bytes_per_frame *
ceil(input_device->latency * bytes_per_second / (double)input_device->bytes_per_frame);

View file

@ -290,7 +290,7 @@ void soundio_output_device_write(struct SoundIoOutputDevice *output_device,
int soundio_output_device_create(struct SoundIoDevice *device,
enum SoundIoSampleFormat sample_format,
enum SoundIoSampleFormat sample_format, int sample_rate,
double latency, void *userdata,
void (*write_callback)(struct SoundIoOutputDevice *, int frame_count),
void (*underrun_callback)(struct SoundIoOutputDevice *),
@ -310,6 +310,7 @@ int soundio_output_device_create(struct SoundIoDevice *device,
output_device->write_callback = write_callback;
output_device->underrun_callback = underrun_callback;
output_device->sample_format = sample_format;
output_device->sample_rate = sample_rate;
output_device->latency = latency;
output_device->bytes_per_frame = soundio_get_bytes_per_frame(sample_format,
device->channel_layout.channel_count);
@ -344,7 +345,8 @@ int soundio_output_device_start(struct SoundIoOutputDevice *output_device) {
}
int soundio_input_device_create(struct SoundIoDevice *device,
enum SoundIoSampleFormat sample_format, double latency, void *userdata,
enum SoundIoSampleFormat sample_format, int sample_rate,
double latency, void *userdata,
void (*read_callback)(struct SoundIoInputDevice *),
struct SoundIoInputDevice **out_input_device)
{
@ -362,6 +364,7 @@ int soundio_input_device_create(struct SoundIoDevice *device,
sid->read_callback = read_callback;
sid->sample_format = sample_format;
sid->latency = latency;
sid->sample_rate = sample_rate;
sid->bytes_per_frame = soundio_get_bytes_per_frame(sample_format,
device->channel_layout.channel_count);

View file

@ -115,9 +115,15 @@ struct SoundIoDevice {
char *name;
char *description;
struct SoundIoChannelLayout channel_layout;
// these values might not actually matter. audio hardware has a set of
// {sample format, sample rate} that they support. you can't know
// whether something worked until you try it.
// these values can be unknown
enum SoundIoSampleFormat default_sample_format;
double default_latency;
int default_sample_rate;
double default_latency;
enum SoundIoDevicePurpose purpose;
int ref_count;
bool is_raw;
@ -127,6 +133,7 @@ struct SoundIoOutputDevice {
void *backend_data;
struct SoundIoDevice *device;
enum SoundIoSampleFormat sample_format;
int sample_rate;
double latency;
int bytes_per_frame;
@ -139,6 +146,7 @@ struct SoundIoInputDevice {
void *backend_data;
struct SoundIoDevice *device;
enum SoundIoSampleFormat sample_format;
int sample_rate;
double latency;
int bytes_per_frame;
@ -283,7 +291,7 @@ enum SoundIoDevicePurpose soundio_device_purpose(const struct SoundIoDevice *dev
// Output Devices
int soundio_output_device_create(struct SoundIoDevice *device,
enum SoundIoSampleFormat sample_format,
enum SoundIoSampleFormat sample_format, int sample_rate,
double latency, void *userdata,
void (*write_callback)(struct SoundIoOutputDevice *, int frame_count),
void (*underrun_callback)(struct SoundIoOutputDevice *),
@ -309,7 +317,8 @@ void soundio_output_device_clear_buffer(struct SoundIoOutputDevice *output_devic
// Input Devices
int soundio_input_device_create(struct SoundIoDevice *device,
enum SoundIoSampleFormat sample_format, double latency, void *userdata,
enum SoundIoSampleFormat sample_format, int sample_rate,
double latency, void *userdata,
void (*read_callback)(struct SoundIoInputDevice *),
struct SoundIoInputDevice **out_input_device);
void soundio_input_device_destroy(struct SoundIoInputDevice *input_device);

View file

@ -37,7 +37,7 @@ static void test_create_output_device(void) {
soundio_device_name(device);
soundio_device_description(device);
struct SoundIoOutputDevice *output_device;
soundio_output_device_create(device, SoundIoSampleFormatFloat, 0.1, NULL,
soundio_output_device_create(device, SoundIoSampleFormatFloat, 48000, 0.1, NULL,
write_callback, underrun_callback, &output_device);
soundio_output_device_destroy(output_device);
soundio_device_unref(device);