From 559d26217310e5454c9cf5c80e49da51b192d7ca Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 13 May 2007 00:22:39 +0000 Subject: fix volume handling git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@5 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce --- TODO | 11 +++++++++++ converter.c | 18 +++++++++--------- oss.c | 13 ++++++++++--- test-sine.c | 19 +++++++++++++++---- 4 files changed, 45 insertions(+), 16 deletions(-) diff --git a/TODO b/TODO index 03c9498..c506e21 100644 --- a/TODO +++ b/TODO @@ -3,4 +3,15 @@ * s/sa_device/sa_stream/ * "adjust" channel map * volume bei codecs? +* non-interleaved "int channel" -> "data[]" +* 24bit = 3 byte? 4 byte? + + +* real playback model +* threaded model + +* alsa +* jack +* pulse +* windows diff --git a/converter.c b/converter.c index 799349c..e49945c 100644 --- a/converter.c +++ b/converter.c @@ -252,8 +252,7 @@ int converter_init( if (byteswap_fix(from->format) != c->work_pcm_format) { c->pre_format_func = get_format_func(byteswap_fix(from->format), c->work_pcm_format); sa_assert(c->pre_format_func); - } else - c->pre_format_func = NULL; + } c->volscale_func = get_volscale_func(c->work_pcm_format); sa_assert(c->volscale_func); @@ -267,14 +266,12 @@ int converter_init( if (resample_required) { c->resample_func = get_resample_func(c->work_pcm_format); sa_assert(c->resample_func); - } else - c->resample_func = NULL; + } if (c->work_pcm_format != byteswap_fix(to->format)) { c->post_format_func = get_format_func(c->work_pcm_format, byteswap_fix(to->format)); sa_assert(c->post_format_func); - } else - c->post_format_func = NULL; + } c->post_byteswap_func = get_byteswap_func(to->format); @@ -283,8 +280,10 @@ int converter_init( /* Initialize resampler */ - if (!(c->speex = speex_resampler_init(c->to_nchannels, c->from_rate, c->to_rate, SPEEX_RESAMPLER_QUALITY_DEFAULT, NULL))) - goto fail; + if (resample_required) { + if (!(c->speex = speex_resampler_init(c->to_nchannels, c->from_rate, c->to_rate, SPEEX_RESAMPLER_QUALITY_DEFAULT, NULL))) + goto fail; + } /* Initialize processing variables */ @@ -698,7 +697,7 @@ void converter_set_volume(converter_t *c, int vol[]) { c->volume_factor[i] = 1; c->volume_divisor[1] = 1; } else { - float f = powf(10.0, vol[i] * 10); + float f = powf(10.0, (float) vol[i] / 2000); continued_fraction(f, 0x7FFF, &num, &denom); @@ -710,6 +709,7 @@ void converter_set_volume(converter_t *c, int vol[]) { } } + c->no_volume = no_volume; } int converter_go_interleaved( diff --git a/oss.c b/oss.c index 7b351ae..bd4f12b 100644 --- a/oss.c +++ b/oss.c @@ -62,6 +62,8 @@ int device_open(sa_device_t *dev) { return SA_ERROR_SYSTEM; } + fcntl(oss->fd, F_SETFL, fcntl(oss->fd, F_GETFL) & ~O_NONBLOCK); /* FIXME*/ + if (!dev->device) { if (!(n = sa_strdup(n))) return SA_ERROR_OOM; @@ -237,7 +239,10 @@ int device_open(sa_device_t *dev) { } r = dev->pcm_attrs.rate; - r = 44100; + + if (r < 8000) + r = 8000; + suggested = 0; phase = 0; @@ -393,8 +398,10 @@ int device_change_output_volume(sa_device_t *dev, int vol[]) { int device_change_rate(sa_device_t *dev, unsigned rate) { oss_device_t *oss = OSS_DEVICE(dev); - converter_set_ratio(&oss->converter_read, oss->real_pcm_attrs.rate, dev->pcm_attrs.rate); - converter_set_ratio(&oss->converter_write, dev->pcm_attrs.rate, oss->real_pcm_attrs.rate); + if (dev->mode & SA_MODE_RDONLY) + converter_set_ratio(&oss->converter_read, oss->real_pcm_attrs.rate, dev->pcm_attrs.rate); + if (dev->mode & SA_MODE_WRONLY) + converter_set_ratio(&oss->converter_write, dev->pcm_attrs.rate, oss->real_pcm_attrs.rate); return SA_SUCCESS; } diff --git a/test-sine.c b/test-sine.c index c0d40e8..d0e28e9 100644 --- a/test-sine.c +++ b/test-sine.c @@ -16,22 +16,33 @@ assert(_r == SA_SUCCESS); \ } while(0) -#define FREQ 880 +#define FREQ 440 int main(int argc, char *argv[]) { sa_device_t *dev; float data[4] = { 0.0, 1.0, 0.0, -1.0 }; - int i; + int i, j; ASSERT_SUCCESS(sa_device_create_pcm(&dev, SA_MODE_WRONLY, SA_PCM_FORMAT_FLOAT32_NE, FREQ * 4, 1)); ASSERT_SUCCESS(sa_device_change_device(dev, "/dev/dsp1")); + ASSERT_SUCCESS(sa_device_set_dynamic_rate(dev, 1)); sa_device_change_meta_data(dev, SA_META_CLIENT_NAME, argv[0], strlen(argv[0])); ASSERT_SUCCESS(sa_device_open(dev)); - for (i = 0; i < FREQ; i++) - ASSERT_SUCCESS(sa_device_write(dev, data, sizeof(data))); + for (j = 0; j < 10; j++) { + int v; + v = -j*500; + +/* ASSERT_SUCCESS(sa_device_change_rate(dev, FREQ*4+100*j)); */ + ASSERT_SUCCESS(sa_device_change_output_volume(dev, &v)); + + for (i = 0; i < FREQ; i++) + ASSERT_SUCCESS(sa_device_write(dev, data, sizeof(data))); + } + + ASSERT_SUCCESS(sa_device_drain(dev)); ASSERT_SUCCESS(sa_device_destroy(dev)); -- cgit