summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--TODO11
-rw-r--r--converter.c18
-rw-r--r--oss.c13
-rw-r--r--test-sine.c19
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));