summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common.c8
-rw-r--r--common.h4
-rw-r--r--converter.c6
-rw-r--r--converter.h2
-rw-r--r--driver.h7
-rw-r--r--oss.c4
-rw-r--r--sydney.h6
7 files changed, 22 insertions, 15 deletions
diff --git a/common.c b/common.c
index 89779bb..3b53e77 100644
--- a/common.c
+++ b/common.c
@@ -272,7 +272,7 @@ int sa_stream_change_device(sa_stream_t *s, const char *device_name) {
return ret;
}
-int sa_stream_change_input_volume(sa_stream_t *s, const int vol[]) {
+int sa_stream_change_input_volume(sa_stream_t *s, const int32_t vol[]) {
int *v, ret;
sa_return_val_if_fail(s, SA_ERROR_INVALID);
@@ -280,7 +280,7 @@ int sa_stream_change_input_volume(sa_stream_t *s, const int vol[]) {
sa_return_val_if_fail(!s->codec, SA_ERROR_NOT_SUPPORTED);
sa_return_val_if_fail(s->mode & SA_MODE_RDONLY, SA_ERROR_STATE);
- if (!(v = sa_newdup(vol, int, s->pcm_attrs.nchannels)))
+ if (!(v = sa_newdup(vol, int32_t, s->pcm_attrs.nchannels)))
return SA_ERROR_OOM;
ret = s->state == SA_STATE_INIT ? SA_SUCCESS : driver_change_input_volume(s, v);
@@ -294,7 +294,7 @@ int sa_stream_change_input_volume(sa_stream_t *s, const int vol[]) {
return ret;
}
-int sa_stream_change_output_volume(sa_stream_t *s, const int vol[]) {
+int sa_stream_change_output_volume(sa_stream_t *s, const int32_t vol[]) {
int *v, ret;
sa_return_val_if_fail(s, SA_ERROR_INVALID);
@@ -302,7 +302,7 @@ int sa_stream_change_output_volume(sa_stream_t *s, const int vol[]) {
sa_return_val_if_fail(!s->codec, SA_ERROR_NOT_SUPPORTED);
sa_return_val_if_fail(s->mode & SA_MODE_WRONLY, SA_ERROR_STATE);
- if (!(v = sa_newdup(vol, int, s->pcm_attrs.nchannels)))
+ if (!(v = sa_newdup(vol, int32_t, s->pcm_attrs.nchannels)))
return SA_ERROR_OOM;
ret = s->state == SA_STATE_INIT ? SA_SUCCESS : driver_change_output_volume(s, v);
diff --git a/common.h b/common.h
index ef92bb7..0444fd4 100644
--- a/common.h
+++ b/common.h
@@ -35,8 +35,8 @@ struct sa_stream {
char *device;
char *driver;
- int *input_volume;
- int *output_volume;
+ int32_t *input_volume;
+ int32_t *output_volume;
void *user_data;
diff --git a/converter.c b/converter.c
index f439b77..b33aafc 100644
--- a/converter.c
+++ b/converter.c
@@ -684,7 +684,7 @@ do_interleave:
return SA_SUCCESS;
}
-void converter_set_volume(converter_t *c, const int vol[]) {
+void converter_set_volume(converter_t *c, const int32_t vol[]) {
unsigned i;
int no_volume = 1;
@@ -696,6 +696,10 @@ void converter_set_volume(converter_t *c, const int vol[]) {
if (vol[i] == 0) {
c->volume_factor[i] = 1;
c->volume_divisor[1] = 1;
+ } else if (vol[i] <= SA_VOLUME_MUTED) {
+ c->volume_factor[i] = 0;
+ c->volume_divisor[1] = 1;
+ no_volume = 0;
} else {
float f = powf(10.0, (float) vol[i] / 2000);
diff --git a/converter.h b/converter.h
index a4592f1..da48d3c 100644
--- a/converter.h
+++ b/converter.h
@@ -73,7 +73,7 @@ int converter_go_interleaved(
void **dst[], size_t *dstr[], int dinterleave,
size_t *size);
-void converter_set_volume(converter_t *c, const int vol[]);
+void converter_set_volume(converter_t *c, const int32_t vol[]);
void converter_set_ratio(converter_t *c, unsigned rate1, unsigned rate2);
diff --git a/driver.h b/driver.h
index 98f65a6..7aaa5e6 100644
--- a/driver.h
+++ b/driver.h
@@ -8,19 +8,22 @@ int driver_destroy(sa_stream_t *dev);
int driver_start_thread(sa_stream_t *dev, sa_event_callback_t *callback);
int driver_change_device(sa_stream_t *dev, const char *device_name);
-int driver_change_input_volume(sa_stream_t *dev, const int vol[]);
-int driver_change_output_volume(sa_stream_t *dev, const int vol[]);
+int driver_change_input_volume(sa_stream_t *dev, const int32_t vol[]);
+int driver_change_output_volume(sa_stream_t *dev, const int32_t vol[]);
int driver_change_rate(sa_stream_t *dev, unsigned rate);
int driver_change_meta_data(sa_stream_t *dev, const char *name, const void *data, size_t size);
int driver_get_state(sa_stream_t *dev, sa_state_t *state);
int driver_get_position(sa_stream_t *dev, sa_position_t position, int64_t *pos);
+
int driver_pread(sa_stream_t *dev, void *data, size_t nbytes, int64_t offset, sa_seek_t whence);
int driver_pwrite(sa_stream_t *dev, const void *data, size_t nbytes, int64_t offset, sa_seek_t whence);
int driver_pread_ni(sa_stream_t *dev, unsigned channel, void *data, size_t nbytes, int64_t offset, sa_seek_t whence);
int driver_pwrite_ni(sa_stream_t *dev, unsigned channel, const void *data, size_t nbytes, int64_t offset, sa_seek_t whence);
+
int driver_get_read_size(sa_stream_t *dev, size_t *size);
int driver_get_write_size(sa_stream_t *dev, size_t *size);
+
int driver_resume(sa_stream_t *dev);
int driver_pause(sa_stream_t *dev);
int driver_drain(sa_stream_t *dev);
diff --git a/oss.c b/oss.c
index 0a80379..6cae5a4 100644
--- a/oss.c
+++ b/oss.c
@@ -376,7 +376,7 @@ int driver_start_thread(sa_stream_t *s, sa_event_callback_t *callback) {
return SA_ERROR_NOT_SUPPORTED;
}
-int driver_change_input_volume(sa_stream_t *s, const int vol[]) {
+int driver_change_input_volume(sa_stream_t *s, const int32_t vol[]) {
oss_stream_t *oss = OSS_STREAM(s);
sa_return_val_if_fail(!s->codec, SA_ERROR_NOT_SUPPORTED);
@@ -386,7 +386,7 @@ int driver_change_input_volume(sa_stream_t *s, const int vol[]) {
return SA_SUCCESS;
}
-int driver_change_output_volume(sa_stream_t *s, const int vol[]) {
+int driver_change_output_volume(sa_stream_t *s, const int32_t vol[]) {
oss_stream_t *oss = OSS_STREAM(s);
sa_return_val_if_fail(!s->codec, SA_ERROR_NOT_SUPPORTED);
diff --git a/sydney.h b/sydney.h
index 5b3f009..1f53784 100644
--- a/sydney.h
+++ b/sydney.h
@@ -30,7 +30,7 @@ async-signal safe.
typedef struct sa_stream sa_stream_t;
/** Volume that corresponds to muted in/out */
-#define SA_VOLUME_MUTED 0x80000000
+#define SA_VOLUME_MUTED ((int32_t) (-0x80000000))
/** Ways to express seek offsets for pread/pwrite */
typedef enum {
@@ -273,10 +273,10 @@ int sa_stream_start_thread(sa_stream_t *s, sa_event_callback_t *callback);
int sa_stream_change_device(sa_stream_t *s, const char *device_name);
/** volume in hundreths of dB*/
-int sa_stream_change_input_volume(sa_stream_t *s, const int vol[]);
+int sa_stream_change_input_volume(sa_stream_t *s, const int32_t vol[]);
/** volume in hundreths of dB*/
-int sa_stream_change_output_volume(sa_stream_t *s, const int vol[]);
+int sa_stream_change_output_volume(sa_stream_t *s, const int32_t vol[]);
/** Change the sampling rate */
int sa_stream_change_rate(sa_stream_t *s, unsigned rate);