summaryrefslogtreecommitdiffstats
path: root/audio_out.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio_out.c')
-rw-r--r--audio_out.c64
1 files changed, 58 insertions, 6 deletions
diff --git a/audio_out.c b/audio_out.c
index 3438f53..8a8814c 100644
--- a/audio_out.c
+++ b/audio_out.c
@@ -103,8 +103,10 @@ int audio_out_set_route(struct tinyalsa_audio_stream_out *stream_out,
stream_out->device_current = device;
- if(device == 0)
+ if(device == 0) {
+ pthread_mutex_unlock(&stream_out->lock);
return stream_out->stream.common.standby((struct audio_stream *) stream_out);
+ }
tinyalsa_mixer_set_device(stream_out->device->mixer, stream_out->device_current);
@@ -278,6 +280,8 @@ static int audio_out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
stream_out = (struct tinyalsa_audio_stream_out *) stream;
if(stream_out->rate != (int) rate) {
+ pthread_mutex_lock(&stream_out->lock);
+
stream_out->rate = rate;
if(stream_out->rate != stream_out->mixer_props->rate) {
@@ -286,6 +290,8 @@ static int audio_out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
stream_out->standby = 1;
}
+
+ pthread_mutex_unlock(&stream_out->lock);
}
return 0;
@@ -345,10 +351,14 @@ static int audio_out_set_format(struct audio_stream *stream, int format)
stream_out = (struct tinyalsa_audio_stream_out *) stream;
if(stream_out->format != (audio_format_t) format) {
+ pthread_mutex_lock(&stream_out->lock);
+
stream_out->format = format;
if(stream_out->format != stream_out->mixer_props->format)
stream_out->standby = 1;
+
+ pthread_mutex_unlock(&stream_out->lock);
}
return 0;
@@ -366,6 +376,8 @@ static int audio_out_standby(struct audio_stream *stream)
stream_out = (struct tinyalsa_audio_stream_out *) stream;
+ pthread_mutex_lock(&stream_out->lock);
+
if(stream_out->pcm != NULL)
audio_out_pcm_close(stream_out);
@@ -380,6 +392,8 @@ static int audio_out_standby(struct audio_stream *stream)
stream_out->standby = 1;
+ pthread_mutex_unlock(&stream_out->lock);
+
return 0;
}
@@ -418,10 +432,18 @@ static int audio_out_set_parameters(struct audio_stream *stream, const char *kvp
value = atoi(value_string);
- if(stream_out->device_current != (audio_devices_t) value)
+ pthread_mutex_lock(&stream_out->device->lock);
+
+ if(stream_out->device_current != (audio_devices_t) value) {
+ pthread_mutex_lock(&stream_out->lock);
audio_out_set_route(stream_out, (audio_devices_t) value);
- if(stream_out->device->ril_interface != NULL && stream_out->device->ril_interface->device_current != (audio_devices_t) value)
+ pthread_mutex_unlock(&stream_out->lock);
+ }
+ if(stream_out->device->ril_interface != NULL && stream_out->device->ril_interface->device_current != (audio_devices_t) value) {
audio_ril_interface_set_route(stream_out->device->ril_interface, (audio_devices_t) value);
+ }
+
+ pthread_mutex_unlock(&stream_out->device->lock);
str_parms_destroy(parms);
@@ -477,8 +499,10 @@ static int audio_out_set_volume(struct audio_stream_out *stream, float left,
volume = (left + right) / 2;
+ pthread_mutex_lock(&stream_out->device->lock);
tinyalsa_mixer_set_output_volume(stream_out->device->mixer,
stream_out->device_current, volume);
+ pthread_mutex_unlock(&stream_out->device->lock);
return 0;
}
@@ -494,6 +518,11 @@ static ssize_t audio_out_write(struct audio_stream_out *stream,
stream_out = (struct tinyalsa_audio_stream_out *) stream;
+ if(stream_out->device == NULL)
+ return -1;
+
+ pthread_mutex_lock(&stream_out->lock);
+
if(stream_out->standby) {
#ifdef YAMAHA_MC1N2_AUDIO
rc = yamaha_mc1n2_audio_output_start(stream_out->device->mc1n2_pdata);
@@ -505,7 +534,7 @@ static ssize_t audio_out_write(struct audio_stream_out *stream,
rc = audio_out_pcm_open(stream_out);
if(rc < 0) {
LOGE("Unable to open pcm device");
- return -1;
+ goto error;
}
stream_out->standby = 0;
@@ -514,10 +543,17 @@ static ssize_t audio_out_write(struct audio_stream_out *stream,
rc = audio_out_write_process(stream_out, (void *) buffer, (int) bytes);
if(rc < 0) {
LOGE("Process and write failed!");
- return -1;
+ goto error;
}
+ pthread_mutex_unlock(&stream_out->lock);
+
return bytes;
+
+error:
+ pthread_mutex_unlock(&stream_out->lock);
+
+ return -1;
}
static int audio_out_get_render_position(const struct audio_stream_out *stream,
@@ -556,6 +592,9 @@ void audio_hw_close_output_stream(struct audio_hw_device *dev,
stream_out = (struct tinyalsa_audio_stream_out *) stream;
+ if(stream_out != NULL && stream_out->resampler != NULL)
+ audio_out_resampler_close(stream_out);
+
#ifdef YAMAHA_MC1N2_AUDIO
if(stream_out != NULL && !stream_out->standby)
yamaha_mc1n2_audio_output_stop(stream_out->device->mc1n2_pdata);
@@ -569,9 +608,12 @@ void audio_hw_close_output_stream(struct audio_hw_device *dev,
tinyalsa_audio_device = (struct tinyalsa_audio_device *) dev;
- tinyalsa_mixer_set_output_state(tinyalsa_audio_device->mixer, 0);
+ pthread_mutex_lock(&tinyalsa_audio_device->lock);
+ tinyalsa_mixer_set_output_state(tinyalsa_audio_device->mixer, 0);
tinyalsa_audio_device->stream_out = NULL;
+
+ pthread_mutex_unlock(&tinyalsa_audio_device->lock);
}
int audio_hw_open_output_stream(struct audio_hw_device *dev,
@@ -659,17 +701,25 @@ int audio_hw_open_output_stream(struct audio_hw_device *dev,
*channels = (uint32_t) tinyalsa_audio_stream_out->channels;
*format = (uint32_t) tinyalsa_audio_stream_out->format;
+ pthread_mutex_lock(&tinyalsa_audio_device->lock);
+
rc = tinyalsa_mixer_set_output_state(tinyalsa_audio_device->mixer, 1);
if(rc < 0) {
LOGE("Unable to set output state");
+ pthread_mutex_unlock(&tinyalsa_audio_device->lock);
goto error_stream;
}
+ pthread_mutex_lock(&tinyalsa_audio_stream_out->lock);
+
audio_out_set_route(tinyalsa_audio_stream_out, devices);
+ pthread_mutex_unlock(&tinyalsa_audio_device->lock);
+
rc = audio_out_pcm_open(tinyalsa_audio_stream_out);
if(rc < 0) {
LOGE("Unable to open pcm device");
+ pthread_mutex_unlock(&tinyalsa_audio_stream_out->lock);
goto error_stream;
}
@@ -677,6 +727,8 @@ int audio_hw_open_output_stream(struct audio_hw_device *dev,
tinyalsa_audio_stream_out->standby = 1;
+ pthread_mutex_unlock(&tinyalsa_audio_stream_out->lock);
+
*stream_out = stream;
return 0;