summaryrefslogtreecommitdiff
path: root/mm_sound_pcm_async.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm_sound_pcm_async.c')
-rw-r--r--mm_sound_pcm_async.c186
1 files changed, 117 insertions, 69 deletions
diff --git a/mm_sound_pcm_async.c b/mm_sound_pcm_async.c
index 91cf700..cde2aa9 100644
--- a/mm_sound_pcm_async.c
+++ b/mm_sound_pcm_async.c
@@ -62,8 +62,8 @@
#define PCM_UNLOCK_INTERNAL(LOCK) do { pthread_mutex_unlock(LOCK); } while (0)
#define PCM_LOCK_DESTROY_INTERNAL(LOCK) do { pthread_mutex_destroy(LOCK); } while (0)
-#define MAINLOOP_LOCK(LOCK) do { pa_threaded_mainloop_lock(LOCK); debug_msg("MAINLOOP locked"); } while (0)
-#define MAINLOOP_UNLOCK(LOCK) do { pa_threaded_mainloop_unlock(LOCK); debug_msg("MAINLOOP unlocked"); } while (0)
+#define MAINLOOP_LOCK(LOCK) do { pa_threaded_mainloop_lock(LOCK); /*debug_msg("MAINLOOP locked");*/ } while (0)
+#define MAINLOOP_UNLOCK(LOCK) do { pa_threaded_mainloop_unlock(LOCK); /*debug_msg("MAINLOOP unlocked");*/ } while (0)
typedef struct {
int asm_handle;
@@ -613,7 +613,13 @@ int mm_sound_pcm_capture_peek(MMSoundPcmHandle_t handle, const void **buffer, co
goto EXIT;
}
#endif
+ if (!pa_threaded_mainloop_in_thread(pcmHandle->mainloop)) {
+ MAINLOOP_LOCK(pcmHandle->mainloop);
+ }
ret = pa_stream_peek (pcmHandle->s, buffer, (unsigned int *)length);
+ if (!pa_threaded_mainloop_in_thread(pcmHandle->mainloop)) {
+ MAINLOOP_UNLOCK(pcmHandle->mainloop);
+ }
EXIT:
// PCM_UNLOCK_INTERNAL(&pcmHandle->pcm_mutex_internal);
@@ -643,8 +649,14 @@ int mm_sound_pcm_capture_drop(MMSoundPcmHandle_t handle)
goto EXIT;
}
+ if (!pa_threaded_mainloop_in_thread(pcmHandle->mainloop)) {
+ MAINLOOP_LOCK(pcmHandle->mainloop);
+ }
if (pa_stream_drop(pcmHandle->s) != 0)
ret = MM_ERROR_SOUND_INTERNAL;
+ if (!pa_threaded_mainloop_in_thread(pcmHandle->mainloop)) {
+ MAINLOOP_UNLOCK(pcmHandle->mainloop);
+ }
EXIT:
// PCM_UNLOCK_INTERNAL(&pcmHandle->pcm_mutex_internal);
NULL_HANDLE:
@@ -959,11 +971,17 @@ int mm_sound_pcm_play_write_async(MMSoundPcmHandle_t handle, void* ptr, unsigned
}
#endif
/* Write */
-
+ if (!pa_threaded_mainloop_in_thread(pcmHandle->mainloop)) {
+ MAINLOOP_LOCK(pcmHandle->mainloop);
+ }
ret = pa_stream_write(pcmHandle->s, ptr, length_byte, NULL, 0LL, PA_SEEK_RELATIVE);
if (ret == 0) {
ret = length_byte;
}
+ if (!pa_threaded_mainloop_in_thread(pcmHandle->mainloop)) {
+ MAINLOOP_UNLOCK(pcmHandle->mainloop);
+ }
+
EXIT:
// PCM_UNLOCK_INTERNAL(&pcmHandle->pcm_mutex_internal);
NULL_HANDLE:
@@ -1113,6 +1131,17 @@ static void __mm_sound_pa_success_cb(pa_context *c, int success, void *userdata)
pa_threaded_mainloop_signal(handle->mainloop, 0);
}
+static void __mm_sound_pa_success_nosignal_cb(pa_context *c, int success, void *userdata)
+{
+ mm_sound_pcm_async_t* handle = (mm_sound_pcm_async_t*) userdata;
+
+ if (!success) {
+ debug_error("pa control failed: %s\n", pa_strerror(pa_context_errno(c)));
+ } else {
+ debug_msg("pa control success\n");
+ }
+}
+
static void _context_state_cb(pa_context *c, void *userdata)
{
pa_context_state_t state;
@@ -1396,104 +1425,123 @@ static int _mm_sound_pa_close(mm_sound_pcm_async_t* handle)
static int _mm_sound_pa_cork(mm_sound_pcm_async_t* handle, int cork)
{
- pa_operation *o = NULL;
+ pa_operation *o = NULL;
- MAINLOOP_LOCK(handle->mainloop);
+ if (pa_threaded_mainloop_in_thread(handle->mainloop)) {
+ o = pa_stream_cork(handle->s, cork, (pa_stream_success_cb_t)__mm_sound_pa_success_nosignal_cb, handle);
+ if (o)
+ pa_operation_unref(o);
+ } else {
+ MAINLOOP_LOCK(handle->mainloop);
- o = pa_stream_cork(handle->s, cork, (pa_stream_success_cb_t)__mm_sound_pa_success_cb, handle);
- if (!(o)) {
- goto unlock_and_fail;
- }
- handle->operation_success = 0;
- while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) {
- pa_threaded_mainloop_wait(handle->mainloop);
- }
- if (!(handle->operation_success)) {
- goto unlock_and_fail;
- }
- pa_operation_unref(o);
+ o = pa_stream_cork(handle->s, cork, (pa_stream_success_cb_t)__mm_sound_pa_success_cb, handle);
+ if (!(o)) {
+ goto unlock_and_fail;
+ }
+ handle->operation_success = 0;
+ while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) {
+ pa_threaded_mainloop_wait(handle->mainloop);
+ }
+ if (!(handle->operation_success)) {
+ goto unlock_and_fail;
+ }
+ pa_operation_unref(o);
- MAINLOOP_UNLOCK(handle->mainloop);
+ MAINLOOP_UNLOCK(handle->mainloop);
+ }
- return 0;
+ return 0;
unlock_and_fail:
debug_error ("error!!!!");
- if (o) {
- pa_operation_cancel(o);
- pa_operation_unref(o);
- }
+ if (o) {
+ pa_operation_cancel(o);
+ pa_operation_unref(o);
+ }
- MAINLOOP_UNLOCK(handle->mainloop);
- return -1;
+ MAINLOOP_UNLOCK(handle->mainloop);
+ return -1;
}
static int _mm_sound_pa_drain(mm_sound_pcm_async_t* handle)
{
- pa_operation *o = NULL;
+ pa_operation *o = NULL;
- MAINLOOP_LOCK(handle->mainloop);
+ if (pa_threaded_mainloop_in_thread(handle->mainloop)) {
+ o = pa_stream_drain(handle->s, (pa_stream_success_cb_t)__mm_sound_pa_success_nosignal_cb, handle);
+ if (o)
+ pa_operation_unref(o);
+ } else {
+ MAINLOOP_LOCK(handle->mainloop);
- o = pa_stream_drain(handle->s, (pa_stream_success_cb_t)__mm_sound_pa_success_cb, handle);
- if (!(o)) {
- goto unlock_and_fail;
- }
- handle->operation_success = 0;
- while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) {
- pa_threaded_mainloop_wait(handle->mainloop);
- }
- if (!(handle->operation_success)) {
- goto unlock_and_fail;
- }
- pa_operation_unref(o);
+ o = pa_stream_drain(handle->s, (pa_stream_success_cb_t)__mm_sound_pa_success_cb, handle);
+ if (!(o)) {
+ goto unlock_and_fail;
+ }
+ handle->operation_success = 0;
- MAINLOOP_UNLOCK(handle->mainloop);
+ while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) {
+ pa_threaded_mainloop_wait(handle->mainloop);
+ }
+ if (!(handle->operation_success)) {
+ goto unlock_and_fail;
+ }
+ pa_operation_unref(o);
- return 0;
+ MAINLOOP_UNLOCK(handle->mainloop);
+ }
+
+ return 0;
unlock_and_fail:
debug_error ("error!!!!");
- if (o) {
- pa_operation_cancel(o);
- pa_operation_unref(o);
- }
+ if (o) {
+ pa_operation_cancel(o);
+ pa_operation_unref(o);
+ }
- MAINLOOP_UNLOCK(handle->mainloop);
- return -1;
+ MAINLOOP_UNLOCK(handle->mainloop);
+ return -1;
}
static int _mm_sound_pa_flush(mm_sound_pcm_async_t* handle)
{
- pa_operation *o = NULL;
+ pa_operation *o = NULL;
- MAINLOOP_LOCK(handle->mainloop);
+ if (pa_threaded_mainloop_in_thread(handle->mainloop)) {
+ o = pa_stream_flush(handle->s, (pa_stream_success_cb_t)__mm_sound_pa_success_nosignal_cb, handle);
+ if (o)
+ pa_operation_unref(o);
+ } else {
+ MAINLOOP_LOCK(handle->mainloop);
- o = pa_stream_flush(handle->s, (pa_stream_success_cb_t)__mm_sound_pa_success_cb, handle);
- if (!(o)) {
- goto unlock_and_fail;
- }
- handle->operation_success = 0;
- while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) {
- pa_threaded_mainloop_wait(handle->mainloop);
- }
- if (!(handle->operation_success)) {
- goto unlock_and_fail;
- }
- pa_operation_unref(o);
+ o = pa_stream_flush(handle->s, (pa_stream_success_cb_t)__mm_sound_pa_success_cb, handle);
+ if (!(o)) {
+ goto unlock_and_fail;
+ }
+ handle->operation_success = 0;
+ while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) {
+ pa_threaded_mainloop_wait(handle->mainloop);
+ }
+ if (!(handle->operation_success)) {
+ goto unlock_and_fail;
+ }
+ pa_operation_unref(o);
- MAINLOOP_UNLOCK(handle->mainloop);
+ MAINLOOP_UNLOCK(handle->mainloop);
+ }
- return 0;
+ return 0;
unlock_and_fail:
debug_error ("error!!!!");
- if (o) {
- pa_operation_cancel(o);
- pa_operation_unref(o);
- }
+ if (o) {
+ pa_operation_cancel(o);
+ pa_operation_unref(o);
+ }
- MAINLOOP_UNLOCK(handle->mainloop);
- return -1;
+ MAINLOOP_UNLOCK(handle->mainloop);
+ return -1;
}
static int _mm_sound_pa_get_latency(mm_sound_pcm_async_t* handle, int* latency)