From 2cab0bb01c193ed3fda072d74d3ffb61e3874f03 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Fri, 2 Sep 2011 16:57:57 +0200 Subject: [PATCH] Portaudio fix on Mac X OS * ship libraries according to portaudio.in * another small fixes (see log) --- ultragrid/configure.ac | 16 ++++++---------- ultragrid/src/audio/portaudio.c | 3 +++ ultragrid/src/main.c | 7 +++++++ ultragrid/src/video_capture/decklink.cpp | 4 ++-- ultragrid/src/video_capture/quicktime.c | 4 +++- ultragrid/src/video_display/decklink.cpp | 4 ++-- ultragrid/src/video_display/dvs.c | 4 +++- ultragrid/src/video_display/gl.c | 2 ++ 8 files changed, 28 insertions(+), 16 deletions(-) diff --git a/ultragrid/configure.ac b/ultragrid/configure.ac index a5e70dbf6..628321fd5 100644 --- a/ultragrid/configure.ac +++ b/ultragrid/configure.ac @@ -306,6 +306,7 @@ case "$host_os" in AC_CHECK_LIB(DeckLinkAPI, main, FOUND_DECKLINK_L=yes, FOUND_DECKLINK_L=no) if test $FOUND_DECKLINK_H = yes -a $FOUND_DECKLINK_SRC = yes -a $FOUND_DECKLINK_L = yes; then FOUND_DECKLINK=yes + LIBS+=" -ldl" else FOUND_DECKLINK=no fi @@ -319,7 +320,6 @@ then DECKLINK_OBJ="src/video_capture/DeckLinkAPIDispatch.o src/video_capture/decklink.o src/video_display/decklink.o" AC_DEFINE([HAVE_DECKLINK], [1], [Build with DeckLink support]) LINKER=$CXX - LIBS+=" -ldl" else DECKLINK_PATH= DECKLINK_INC= @@ -737,15 +737,11 @@ AC_CHECK_FILE(${PORTAUDIO_LIB}/libportaudio.a, IS_PORTAUDIO_STATIC=yes, IS_PORTA if test $FOUND_PORTAUDIO_H = yes -a $FOUND_PORTAUDIO_L = yes -a $IS_PORTAUDIO_STATIC = yes then PORTAUDIO_INC=-I${PORTAUDIO_INC} -case "$host_os" in - *darwin*) - PORTAUDIO_LIB="${PORTAUDIO_LIB}/libportaudio.a -framework CoreAudio -framework AudioToolbox -framework AudioUnit -framework CoreServices" - ;; - *) - PORTAUDIO_LIB="${PORTAUDIO_LIB}/libportaudio.a" - LIBS+=" -lasound" - ;; -esac + # we have now portaudio linked statically + # TODO: consider linking it dynamically + PORTAUDIO_LIB="${PORTAUDIO_LIB}/libportaudio.a" + PORTAUDIO_LIB+="`cat ../portaudio/portaudio-2.0.pc|grep '^Libs: '|sed 's/^Libs: -L\${libdir} -lportaudio//'`" + CFLAGS+="`cat ../portaudio/portaudio-2.0.pc|grep '^Cflags: '|sed 's/^Cflags: -I\${includedir}//'`" PORTAUDIO_OBJ="$PORTAUDIO_OBJ src/audio/portaudio.o" AC_DEFINE([HAVE_PORTAUDIO], [1], [Build with Portaudio support]) else diff --git a/ultragrid/src/audio/portaudio.c b/ultragrid/src/audio/portaudio.c index 4388e14b2..4f3165763 100644 --- a/ultragrid/src/audio/portaudio.c +++ b/ultragrid/src/audio/portaudio.c @@ -404,6 +404,9 @@ void portaudio_put_frame(void *state) error = Pa_WriteStream(s->stream, s->frame.data, s->frame.data_len / (s->frame.bps * s->frame.ch_count)); if(error != paNoError) { + if(error == paOutputUnderflowed) { /* put current frame once more */ + Pa_WriteStream(s->stream, s->frame.data, s->frame.data_len / (s->frame.bps * s->frame.ch_count)); + } printf("Pa write stream error: %s\n", Pa_GetErrorText(error)); } } diff --git a/ultragrid/src/main.c b/ultragrid/src/main.c index 629b34271..89b0c343d 100644 --- a/ultragrid/src/main.c +++ b/ultragrid/src/main.c @@ -1025,6 +1025,13 @@ int main(int argc, char *argv[]) void cleanup_uv(void) { + /* give threads time to exit gracefully + * it is not ideal but rather good solution + * to avoid segfaults. + */ + should_exit = 1; + usleep(100000); + tx_done(uv_state->tx); destroy_devices(uv_state->network_devices); vidcap_done(uv_state->capture_device); diff --git a/ultragrid/src/video_capture/decklink.cpp b/ultragrid/src/video_capture/decklink.cpp index d376883ed..c7f0a1da9 100644 --- a/ultragrid/src/video_capture/decklink.cpp +++ b/ultragrid/src/video_capture/decklink.cpp @@ -264,7 +264,7 @@ decklink_help() result = deckLink->GetModelName((STRING *) &deviceNameString); #ifdef HAVE_MACOSX deviceNameCString = (char *) malloc(128); - CFStringGetCString(deviceNameString, deviceNameCString, 128, kCFStringEncodingMacRoman); + CFStringGetCString(deviceNameString, (char *)deviceNameCString, 128, kCFStringEncodingMacRoman); #else deviceNameCString = deviceNameString; #endif @@ -937,7 +937,7 @@ print_output_modes (IDeckLink* deckLink) result = displayMode->GetName((STRING *) &displayModeString); #ifdef HAVE_MACOSX displayModeCString = (char *) malloc(128); - CFStringGetCString(displayModeString, displayModeCString, 128, kCFStringEncodingMacRoman); + CFStringGetCString(displayModeString, (char *) displayModeCString, 128, kCFStringEncodingMacRoman); #else displayModeCString = displayModeString; #endif diff --git a/ultragrid/src/video_capture/quicktime.c b/ultragrid/src/video_capture/quicktime.c index 6c1ad37f2..3091afa01 100644 --- a/ultragrid/src/video_capture/quicktime.c +++ b/ultragrid/src/video_capture/quicktime.c @@ -69,6 +69,8 @@ #define MAGIC_QT_GRABBER VIDCAP_QUICKTIME_ID +extern int should_exit; + struct qt_grabber_state { uint32_t magic; SeqGrabComponent grabber; @@ -869,7 +871,7 @@ void * vidcap_quicktime_thread(void *state) { struct qt_grabber_state *s = (struct qt_grabber_state *)state; - while(1) { + while(!should_exit) { memset(s->abuffer[s->grab_buf_idx], 0, s->abuffer_len); s->abuffer_len = 0; /* Run the QuickTime sequence grabber idle function, which provides */ diff --git a/ultragrid/src/video_display/decklink.cpp b/ultragrid/src/video_display/decklink.cpp index d4982b307..ecf87b357 100644 --- a/ultragrid/src/video_display/decklink.cpp +++ b/ultragrid/src/video_display/decklink.cpp @@ -159,7 +159,7 @@ static void show_help(void) result = deckLink->GetModelName((STRING *) &deviceNameString); #ifdef HAVE_MACOSX deviceNameCString = (char *) malloc(128); - CFStringGetCString(deviceNameString, deviceNameCString, 128, kCFStringEncodingMacRoman); + CFStringGetCString(deviceNameString, (char *) deviceNameCString, 128, kCFStringEncodingMacRoman); #else deviceNameCString = deviceNameString; #endif @@ -319,7 +319,7 @@ reconfigure_screen_decklink(void *state, unsigned int width, unsigned int height { #ifdef HAVE_MACOSX modeNameCString = (char *) malloc(128); - CFStringGetCString(modeNameString, modeNameCString, 128, kCFStringEncodingMacRoman); + CFStringGetCString(modeNameString, (char *) modeNameCString, 128, kCFStringEncodingMacRoman); #else modeNameCString = modeNameString; #endif diff --git a/ultragrid/src/video_display/dvs.c b/ultragrid/src/video_display/dvs.c index fad8601c7..b7771c83c 100644 --- a/ultragrid/src/video_display/dvs.c +++ b/ultragrid/src/video_display/dvs.c @@ -67,6 +67,8 @@ #define HDSP_MAGIC 0x12345678 +extern int should_exit; + /* TODO: set properties for commented-out formats (if known) */ const hdsp_mode_table_t hdsp_mode_table[] = { @@ -376,7 +378,7 @@ void display_dvs_run(void *arg) struct state_hdsp *s = (struct state_hdsp *)arg; int res; - while (1) { + while (!should_exit) { pthread_mutex_lock(&s->lock); while (s->work_to_do == FALSE) { diff --git a/ultragrid/src/video_display/gl.c b/ultragrid/src/video_display/gl.c index 3614e09a8..2acfd1c07 100644 --- a/ultragrid/src/video_display/gl.c +++ b/ultragrid/src/video_display/gl.c @@ -83,6 +83,7 @@ /* defined in main.c */ extern int uv_argc; +extern int should_exit; extern char **uv_argv; struct state_gl { @@ -689,6 +690,7 @@ void glut_key_callback(unsigned char key, int x, int y) platform_sem_post(&gl->semaphore); if(gl->window != -1) glutDestroyWindow(gl->window); + should_exit = 1; exit(0); break; case 'd':