summaryrefslogtreecommitdiffstats
path: root/audio_in.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio_in.c')
-rw-r--r--audio_in.c59
1 files changed, 53 insertions, 6 deletions
diff --git a/audio_in.c b/audio_in.c
index 3933bbf..618daf1 100644
--- a/audio_in.c
+++ b/audio_in.c
@@ -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;