diff options
Diffstat (limited to 'audio_out.c')
-rw-r--r-- | audio_out.c | 64 |
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; |