diff options
Diffstat (limited to 'audio_in.c')
-rw-r--r-- | audio_in.c | 59 |
1 files changed, 53 insertions, 6 deletions
@@ -99,9 +99,10 @@ int audio_in_set_route(struct tinyalsa_audio_stream_in *stream_in, stream_in->device_current = device; - if(device == 0) + if(device == 0) { + pthread_mutex_unlock(&stream_in->lock); return stream_in->stream.common.standby((struct audio_stream *) stream_in); - + } tinyalsa_mixer_set_device(stream_in->device->mixer, stream_in->device_current); @@ -363,6 +364,8 @@ static int audio_in_set_sample_rate(struct audio_stream *stream, uint32_t rate) stream_in = (struct tinyalsa_audio_stream_in *) stream; if(stream_in->rate != (int) rate) { + pthread_mutex_lock(&stream_in->lock); + stream_in->rate = rate; if(stream_in->rate != stream_in->mixer_props->rate) { @@ -371,6 +374,8 @@ static int audio_in_set_sample_rate(struct audio_stream *stream, uint32_t rate) stream_in->standby = 1; } + + pthread_mutex_unlock(&stream_in->lock); } return 0; @@ -430,10 +435,14 @@ static int audio_in_set_format(struct audio_stream *stream, int format) stream_in = (struct tinyalsa_audio_stream_in *) stream; if(stream_in->format != (audio_format_t) format) { + pthread_mutex_lock(&stream_in->lock); + stream_in->format = format; if(stream_in->format != stream_in->mixer_props->format) stream_in->standby = 1; + + pthread_mutex_unlock(&stream_in->lock); } return 0; @@ -451,6 +460,8 @@ static int audio_in_standby(struct audio_stream *stream) stream_in = (struct tinyalsa_audio_stream_in *) stream; + pthread_mutex_lock(&stream_in->lock); + if(stream_in->pcm != NULL) audio_in_pcm_close(stream_in); @@ -465,6 +476,8 @@ static int audio_in_standby(struct audio_stream *stream) stream_in->standby = 1; + pthread_mutex_unlock(&stream_in->lock); + return 0; } @@ -503,8 +516,15 @@ static int audio_in_set_parameters(struct audio_stream *stream, const char *kvpa value = atoi(value_string); - if(stream_in->device_current != (audio_devices_t) value) + pthread_mutex_lock(&stream_in->device->lock); + + if(stream_in->device_current != (audio_devices_t) value) { + pthread_mutex_lock(&stream_in->lock); audio_in_set_route(stream_in, (audio_devices_t) value); + pthread_mutex_unlock(&stream_in->lock); + } + + pthread_mutex_unlock(&stream_in->device->lock); str_parms_destroy(parms); @@ -538,8 +558,10 @@ static int audio_in_set_gain(struct audio_stream_in *stream, float gain) if(stream_in->device == NULL || stream_in->device->mixer == NULL) return -1; + pthread_mutex_lock(&stream_in->device->lock); tinyalsa_mixer_set_input_gain(stream_in->device->mixer, stream_in->device_current, gain); + pthread_mutex_unlock(&stream_in->device->lock); return 0; } @@ -555,6 +577,11 @@ static ssize_t audio_in_read(struct audio_stream_in *stream, stream_in = (struct tinyalsa_audio_stream_in *) stream; + if(stream_in->device == NULL) + return -1; + + pthread_mutex_lock(&stream_in->lock); + if(stream_in->standby) { #ifdef YAMAHA_MC1N2_AUDIO rc = yamaha_mc1n2_audio_input_start(stream_in->device->mc1n2_pdata); @@ -566,7 +593,7 @@ static ssize_t audio_in_read(struct audio_stream_in *stream, rc = audio_in_pcm_open(stream_in); if(rc < 0) { LOGE("Unable to open pcm device"); - return -1; + goto error; } stream_in->standby = 0; @@ -575,13 +602,20 @@ static ssize_t audio_in_read(struct audio_stream_in *stream, rc = audio_in_read_process(stream_in, buffer, (int) bytes); if(rc < 0) { LOGE("Read and process failed!"); - return -1; + goto error; } if(stream_in->device != NULL && stream_in->device->mic_mute) memset(buffer, 0, bytes); + pthread_mutex_unlock(&stream_in->lock); + return bytes; + +error: + pthread_mutex_unlock(&stream_in->lock); + + return -1; } static uint32_t audio_in_get_input_frames_lost(struct audio_stream_in *stream) @@ -633,9 +667,12 @@ void audio_hw_close_input_stream(struct audio_hw_device *dev, tinyalsa_audio_device = (struct tinyalsa_audio_device *) dev; - tinyalsa_mixer_set_input_state(tinyalsa_audio_device->mixer, 0); + pthread_mutex_lock(&tinyalsa_audio_device->lock); + tinyalsa_mixer_set_input_state(tinyalsa_audio_device->mixer, 0); tinyalsa_audio_device->stream_in = NULL; + + pthread_mutex_unlock(&tinyalsa_audio_device->lock); } int audio_hw_open_input_stream(struct audio_hw_device *dev, @@ -729,17 +766,25 @@ int audio_hw_open_input_stream(struct audio_hw_device *dev, *channels = (uint32_t) tinyalsa_audio_stream_in->channels; *format = (uint32_t) tinyalsa_audio_stream_in->format; + pthread_mutex_lock(&tinyalsa_audio_device->lock); + rc = tinyalsa_mixer_set_input_state(tinyalsa_audio_device->mixer, 1); if(rc < 0) { LOGE("Unable to set input state"); + pthread_mutex_unlock(&tinyalsa_audio_device->lock); goto error_stream; } + pthread_mutex_lock(&tinyalsa_audio_stream_in->lock); + audio_in_set_route(tinyalsa_audio_stream_in, devices); + pthread_mutex_unlock(&tinyalsa_audio_device->lock); + rc = audio_in_pcm_open(tinyalsa_audio_stream_in); if(rc < 0) { LOGE("Unable to open pcm device"); + pthread_mutex_unlock(&tinyalsa_audio_stream_in->lock); goto error_stream; } @@ -747,6 +792,8 @@ int audio_hw_open_input_stream(struct audio_hw_device *dev, tinyalsa_audio_stream_in->standby = 1; + pthread_mutex_unlock(&tinyalsa_audio_stream_in->lock); + *stream_in = stream; return 0; |