From c52e76928f257e964a7b890bc529d563d001c542 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 1 Aug 2015 22:40:55 -0700 Subject: [PATCH] fix build on linux --- README.md | 1 - src/alsa.cpp | 14 +++- src/channel_layout.cpp | 170 +++++++++++++++++++++++++++++++++++++++++ src/coreaudio.cpp | 19 +++-- src/pulseaudio.cpp | 53 ++++++++----- test/unit_tests.cpp | 1 + 6 files changed, 227 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 621a57b..6aa7520 100644 --- a/README.md +++ b/README.md @@ -244,7 +244,6 @@ view `coverage/index.html` in a browser. 0. implement CoreAudio (OSX) backend, get examples working 0. Add some builtin channel layouts from https://developer.apple.com/library/mac/documentation/MusicAudio/Reference/CoreAudioDataTypesRef/#//apple_ref/doc/constant_group/Audio_Channel_Layout_Tags - 0. Add more PulseAudio channel ids 0. Make sure PulseAudio can handle refresh devices crashing before block_until_have_devices 0. implement WASAPI (Windows) backend, get examples working diff --git a/src/alsa.cpp b/src/alsa.cpp index a2fcc76..c9fe2ab 100644 --- a/src/alsa.cpp +++ b/src/alsa.cpp @@ -156,9 +156,10 @@ static int to_alsa_chmap_pos(SoundIoChannelId channel_id) { case SoundIoChannelIdBottomCenter: return SND_CHMAP_BC; case SoundIoChannelIdBottomLeftCenter: return SND_CHMAP_BLC; case SoundIoChannelIdBottomRightCenter: return SND_CHMAP_BRC; - case SoundIoChannelIdInvalid: return SND_CHMAP_UNKNOWN; + + default: + return SND_CHMAP_UNKNOWN; } - return SND_CHMAP_UNKNOWN; } static void get_channel_layout(SoundIoChannelLayout *dest, snd_pcm_chmap_t *chmap) { @@ -717,6 +718,7 @@ static void shutdown_backend(SoundIoPrivate *si, int err) { static void device_thread_run(void *arg) { SoundIoPrivate *si = (SoundIoPrivate *)arg; + SoundIo *soundio = &si->pub; SoundIoAlsa *sia = &si->backend_data.alsa; // Some systems cannot read integer variables if they are not @@ -808,8 +810,12 @@ static void device_thread_run(void *arg) { err = refresh_devices(si); if (err) shutdown_backend(si, err); - if (!sia->have_devices_flag.exchange(true)) - soundio_os_cond_signal(sica->have_devices_cond, nullptr); + if (!sia->have_devices_flag.exchange(true)) { + soundio_os_mutex_lock(sia->mutex); + soundio_os_cond_signal(sia->cond, sia->mutex); + soundio->on_events_signal(soundio); + soundio_os_mutex_unlock(sia->mutex); + } if (err) return; } diff --git a/src/channel_layout.cpp b/src/channel_layout.cpp index 4d48aed..4f023c8 100644 --- a/src/channel_layout.cpp +++ b/src/channel_layout.cpp @@ -470,6 +470,11 @@ static const char *channel_names[][channel_name_alias_count] = { nullptr, nullptr, }, + [SoundIoChannelIdLfe2] = { + "LFE 2", + nullptr, + nullptr, + }, [SoundIoChannelIdBottomCenter] = { "Bottom Center", nullptr, @@ -485,6 +490,171 @@ static const char *channel_names[][channel_name_alias_count] = { nullptr, nullptr, }, + [SoundIoChannelIdMsMid] = { + "Mid/Side Mid", + nullptr, + nullptr, + }, + [SoundIoChannelIdMsSide] = { + "Mid/Side Side", + nullptr, + nullptr, + }, + [SoundIoChannelIdAmbisonicW] = { + "Ambisonic W", + nullptr, + nullptr, + }, + [SoundIoChannelIdAmbisonicX] = { + "Ambisonic X", + nullptr, + nullptr, + }, + [SoundIoChannelIdAmbisonicY] = { + "Ambisonic Y", + nullptr, + nullptr, + }, + [SoundIoChannelIdAmbisonicZ] = { + "Ambisonic Z", + nullptr, + nullptr, + }, + [SoundIoChannelIdXyX] = { + "X-Y X", + nullptr, + nullptr, + }, + [SoundIoChannelIdXyY] = { + "X-Y Y", + nullptr, + nullptr, + }, + [SoundIoChannelIdHeadphonesLeft] = { + "Headphones Left", + nullptr, + nullptr, + }, + [SoundIoChannelIdHeadphonesRight] = { + "Headphones Right", + nullptr, + nullptr, + }, + [SoundIoChannelIdClickTrack] = { + "Click Track", + nullptr, + nullptr, + }, + [SoundIoChannelIdForeignLanguage] = { + "Foreign Language", + nullptr, + nullptr, + }, + [SoundIoChannelIdHearingImpaired] = { + "Hearing Impaired", + nullptr, + nullptr, + }, + [SoundIoChannelIdNarration] = { + "Narration", + nullptr, + nullptr, + }, + [SoundIoChannelIdHaptic] = { + "Haptic", + nullptr, + nullptr, + }, + [SoundIoChannelIdDialogCentricMix] = { + "Dialog Centric Mix", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux] = { + "Aux", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux0] = { + "Aux 0", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux1] = { + "Aux 1", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux2] = { + "Aux 2", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux3] = { + "Aux 3", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux4] = { + "Aux 4", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux5] = { + "Aux 5", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux6] = { + "Aux 6", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux7] = { + "Aux 7", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux8] = { + "Aux 8", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux9] = { + "Aux 9", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux10] = { + "Aux 10", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux11] = { + "Aux 11", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux12] = { + "Aux 12", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux13] = { + "Aux 13", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux14] = { + "Aux 14", + nullptr, + nullptr, + }, + [SoundIoChannelIdAux15] = { + "Aux 15", + nullptr, + nullptr, + }, }; const char *soundio_get_channel_name(enum SoundIoChannelId id) { diff --git a/src/coreaudio.cpp b/src/coreaudio.cpp index e644754..1b0fdfd 100644 --- a/src/coreaudio.cpp +++ b/src/coreaudio.cpp @@ -151,17 +151,17 @@ static SoundIoChannelId from_channel_descr(const AudioChannelDescription *descr) case kAudioChannelLabel_Right: return SoundIoChannelIdFrontRight; case kAudioChannelLabel_Center: return SoundIoChannelIdFrontCenter; case kAudioChannelLabel_LFEScreen: return SoundIoChannelIdLfe; - case kAudioChannelLabel_LeftSurround: return SoundIoChannelIdSideLeft; - case kAudioChannelLabel_RightSurround: return SoundIoChannelIdSideRight; - case kAudioChannelLabel_LeftCenter: return SoundIoChannelIdSideLeft; - case kAudioChannelLabel_RightCenter: return SoundIoChannelIdSideRight; + case kAudioChannelLabel_LeftSurround: return SoundIoChannelIdBackLeft; + case kAudioChannelLabel_RightSurround: return SoundIoChannelIdBackRight; + case kAudioChannelLabel_LeftCenter: return SoundIoChannelIdFrontLeftCenter; + case kAudioChannelLabel_RightCenter: return SoundIoChannelIdFrontRightCenter; case kAudioChannelLabel_CenterSurround: return SoundIoChannelIdBackCenter; case kAudioChannelLabel_LeftSurroundDirect: return SoundIoChannelIdSideLeft; case kAudioChannelLabel_RightSurroundDirect: return SoundIoChannelIdSideRight; case kAudioChannelLabel_TopCenterSurround: return SoundIoChannelIdTopCenter; - case kAudioChannelLabel_VerticalHeightLeft: return SoundIoChannelIdTopSideLeft; - case kAudioChannelLabel_VerticalHeightCenter: return SoundIoChannelIdTopCenter; - case kAudioChannelLabel_VerticalHeightRight: return SoundIoChannelIdTopSideRight; + case kAudioChannelLabel_VerticalHeightLeft: return SoundIoChannelIdTopFrontLeft; + case kAudioChannelLabel_VerticalHeightCenter: return SoundIoChannelIdTopFrontCenter; + case kAudioChannelLabel_VerticalHeightRight: return SoundIoChannelIdTopFrontRight; case kAudioChannelLabel_TopBackLeft: return SoundIoChannelIdTopBackLeft; case kAudioChannelLabel_TopBackCenter: return SoundIoChannelIdTopBackCenter; case kAudioChannelLabel_TopBackRight: return SoundIoChannelIdTopBackRight; @@ -629,6 +629,7 @@ static void wakeup_ca(struct SoundIoPrivate *si) { static void device_thread_run(void *arg) { SoundIoPrivate *si = (SoundIoPrivate *)arg; + SoundIo *soundio = &si->pub; SoundIoCoreAudio *sica = &si->backend_data.coreaudio; int err; @@ -643,8 +644,10 @@ static void device_thread_run(void *arg) { err = refresh_devices(si); if (err) shutdown_backend(si, err); - if (!sica->have_devices_flag.exchange(true)) + if (!sica->have_devices_flag.exchange(true)) { soundio_os_cond_signal(sica->have_devices_cond, nullptr); + soundio->on_events_signal(soundio); + } if (err) return; soundio_os_cond_signal(sica->cond, nullptr); diff --git a/src/pulseaudio.cpp b/src/pulseaudio.cpp index fbc508e..ec987d7 100644 --- a/src/pulseaudio.cpp +++ b/src/pulseaudio.cpp @@ -128,6 +128,23 @@ static SoundIoChannelId from_pulseaudio_channel_pos(pa_channel_position_t pos) { case PA_CHANNEL_POSITION_TOP_REAR_RIGHT: return SoundIoChannelIdTopBackRight; case PA_CHANNEL_POSITION_TOP_REAR_CENTER: return SoundIoChannelIdTopBackCenter; + case PA_CHANNEL_POSITION_AUX0: return SoundIoChannelIdAux0; + case PA_CHANNEL_POSITION_AUX1: return SoundIoChannelIdAux1; + case PA_CHANNEL_POSITION_AUX2: return SoundIoChannelIdAux2; + case PA_CHANNEL_POSITION_AUX3: return SoundIoChannelIdAux3; + case PA_CHANNEL_POSITION_AUX4: return SoundIoChannelIdAux4; + case PA_CHANNEL_POSITION_AUX5: return SoundIoChannelIdAux5; + case PA_CHANNEL_POSITION_AUX6: return SoundIoChannelIdAux6; + case PA_CHANNEL_POSITION_AUX7: return SoundIoChannelIdAux7; + case PA_CHANNEL_POSITION_AUX8: return SoundIoChannelIdAux8; + case PA_CHANNEL_POSITION_AUX9: return SoundIoChannelIdAux9; + case PA_CHANNEL_POSITION_AUX10: return SoundIoChannelIdAux10; + case PA_CHANNEL_POSITION_AUX11: return SoundIoChannelIdAux11; + case PA_CHANNEL_POSITION_AUX12: return SoundIoChannelIdAux12; + case PA_CHANNEL_POSITION_AUX13: return SoundIoChannelIdAux13; + case PA_CHANNEL_POSITION_AUX14: return SoundIoChannelIdAux14; + case PA_CHANNEL_POSITION_AUX15: return SoundIoChannelIdAux15; + default: return SoundIoChannelIdInvalid; } } @@ -562,26 +579,26 @@ static pa_channel_position_t to_pulseaudio_channel_pos(SoundIoChannelId channel_ case SoundIoChannelIdTopBackCenter: return PA_CHANNEL_POSITION_TOP_REAR_CENTER; case SoundIoChannelIdTopBackRight: return PA_CHANNEL_POSITION_TOP_REAR_RIGHT; - case SoundIoChannelIdInvalid: - case SoundIoChannelIdBackLeftCenter: - case SoundIoChannelIdBackRightCenter: - case SoundIoChannelIdFrontLeftWide: - case SoundIoChannelIdFrontRightWide: - case SoundIoChannelIdFrontLeftHigh: - case SoundIoChannelIdFrontCenterHigh: - case SoundIoChannelIdFrontRightHigh: - case SoundIoChannelIdTopFrontLeftCenter: - case SoundIoChannelIdTopFrontRightCenter: - case SoundIoChannelIdTopSideLeft: - case SoundIoChannelIdTopSideRight: - case SoundIoChannelIdLeftLfe: - case SoundIoChannelIdRightLfe: - case SoundIoChannelIdBottomCenter: - case SoundIoChannelIdBottomLeftCenter: - case SoundIoChannelIdBottomRightCenter: + case SoundIoChannelIdAux0: return PA_CHANNEL_POSITION_AUX0; + case SoundIoChannelIdAux1: return PA_CHANNEL_POSITION_AUX1; + case SoundIoChannelIdAux2: return PA_CHANNEL_POSITION_AUX2; + case SoundIoChannelIdAux3: return PA_CHANNEL_POSITION_AUX3; + case SoundIoChannelIdAux4: return PA_CHANNEL_POSITION_AUX4; + case SoundIoChannelIdAux5: return PA_CHANNEL_POSITION_AUX5; + case SoundIoChannelIdAux6: return PA_CHANNEL_POSITION_AUX6; + case SoundIoChannelIdAux7: return PA_CHANNEL_POSITION_AUX7; + case SoundIoChannelIdAux8: return PA_CHANNEL_POSITION_AUX8; + case SoundIoChannelIdAux9: return PA_CHANNEL_POSITION_AUX9; + case SoundIoChannelIdAux10: return PA_CHANNEL_POSITION_AUX10; + case SoundIoChannelIdAux11: return PA_CHANNEL_POSITION_AUX11; + case SoundIoChannelIdAux12: return PA_CHANNEL_POSITION_AUX12; + case SoundIoChannelIdAux13: return PA_CHANNEL_POSITION_AUX13; + case SoundIoChannelIdAux14: return PA_CHANNEL_POSITION_AUX14; + case SoundIoChannelIdAux15: return PA_CHANNEL_POSITION_AUX15; + + default: return PA_CHANNEL_POSITION_INVALID; } - return PA_CHANNEL_POSITION_INVALID; } static pa_channel_map to_pulseaudio_channel_map(const SoundIoChannelLayout *channel_layout) { diff --git a/test/unit_tests.cpp b/test/unit_tests.cpp index 1f9713d..2484a04 100644 --- a/test/unit_tests.cpp +++ b/test/unit_tests.cpp @@ -30,6 +30,7 @@ static void test_create_outstream(void) { struct SoundIo *soundio = soundio_create(); assert(soundio); ok_or_panic(soundio_connect(soundio)); + soundio_flush_events(soundio); int default_out_device_index = soundio_default_output_device_index(soundio); assert(default_out_device_index >= 0); struct SoundIoDevice *device = soundio_get_output_device(soundio, default_out_device_index);