From 6dd76f6288b278324bacf2380fbf0ea3bbb4ace1 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Wed, 28 Feb 2018 19:37:17 -0500 Subject: [PATCH] Sync AudioOutBuffer comments with wiki. Updated audoutPlayBuffer() comments. Moved the waiting/post-append code from audoutPlayBuffer() into new func audoutWaitPlayFinish(). Removed '&' from code setting audoutAppendAudioOutBuffer() raw->tag. --- nx/include/switch/services/audout.h | 14 ++++++++--- nx/source/services/audout.c | 36 +++++++++++++++++------------ 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/nx/include/switch/services/audout.h b/nx/include/switch/services/audout.h index d9e7a62f..26bde742 100644 --- a/nx/include/switch/services/audout.h +++ b/nx/include/switch/services/audout.h @@ -28,11 +28,11 @@ typedef struct AudioOutBuffer AudioOutBuffer; struct AudioOutBuffer { - AudioOutBuffer* next; ///< Next buffer. + AudioOutBuffer* next; ///< Next buffer. (Unused) void* buffer; ///< Sample buffer (aligned to 0x1000 bytes). u64 buffer_size; ///< Sample buffer size. u64 data_size; ///< Size of data inside the buffer. - u64 data_offset; ///< Offset of data inside the buffer. + u64 data_offset; ///< Offset of data inside the buffer. (Unused?) }; Result audoutInitialize(void); @@ -48,12 +48,20 @@ Result audoutGetReleasedAudioOutBuffer(AudioOutBuffer *Buffer, u32 *ReleasedBuff Result audoutContainsAudioOutBuffer(AudioOutBuffer *Buffer, bool *ContainsBuffer); /** - * @brief Submits an audio sample data buffer for playing. + * @brief Submits an audio sample data buffer for playing and waits for it to finish playing. + * @brief Uses \ref audoutAppendAudioOutBuffer and \ref audoutWaitPlayFinish internally. * @param source AudioOutBuffer containing the source sample data to be played. * @param released AudioOutBuffer to receive the last played buffer. */ Result audoutPlayBuffer(AudioOutBuffer *source, AudioOutBuffer *released); +/** + * @brief Waits for audio playback to finish. + * @param released AudioOutBuffer to receive the last played buffer. + * @param timeout Timeout value, use U64_MAX to wait until all finished. + */ +Result audoutWaitPlayFinish(AudioOutBuffer *released, u64 timeout); + /// These return the state associated with the currently active audio output device. u32 audoutGetSampleRate(void); ///< Supported sample rate (48000Hz). u32 audoutGetChannelCount(void); ///< Supported channel count (2 channels). diff --git a/nx/source/services/audout.c b/nx/source/services/audout.c index 6c2a6096..b3453ad2 100644 --- a/nx/source/services/audout.c +++ b/nx/source/services/audout.c @@ -82,26 +82,32 @@ AudioOutState audoutGetDeviceState(void) { return g_deviceState; } +Result audoutWaitPlayFinish(AudioOutBuffer *released, u64 timeout) { + // Wait on the buffer event handle + Result do_wait = svcWaitSynchronizationSingle(g_audoutBufferEventHandle, timeout); + + if (R_SUCCEEDED(do_wait)) + { + svcResetSignal(g_audoutBufferEventHandle); + + u32 released_count = 0; + Result do_release = audoutGetReleasedAudioOutBuffer(released, &released_count); + + // Ensure that all buffers are released and return the last one only + while (R_SUCCEEDED(do_release) && (released_count > 0)) + do_release = audoutGetReleasedAudioOutBuffer(released, &released_count); + } + + return do_wait; +} + Result audoutPlayBuffer(AudioOutBuffer *source, AudioOutBuffer *released) { // Try to push the supplied buffer to the audio output device Result do_append = audoutAppendAudioOutBuffer(source); if (R_SUCCEEDED(do_append)) { - // Wait on the buffer event handle - Result do_wait = svcWaitSynchronizationSingle(g_audoutBufferEventHandle, U64_MAX); - - if (R_SUCCEEDED(do_wait)) - { - svcResetSignal(g_audoutBufferEventHandle); - - u32 released_count = 0; - Result do_release = audoutGetReleasedAudioOutBuffer(released, &released_count); - - // Ensure that all buffers are released and return the last one only - while (R_SUCCEEDED(do_release) && (released_count > 0)) - do_release = audoutGetReleasedAudioOutBuffer(released, &released_count); - } + audoutWaitPlayFinish(released, U64_MAX); } return do_append; @@ -319,7 +325,7 @@ Result audoutAppendAudioOutBuffer(AudioOutBuffer *Buffer) { raw->magic = SFCI_MAGIC; raw->cmd_id = 3; - raw->tag = (u64)&Buffer; + raw->tag = (u64)Buffer; Result rc = serviceIpcDispatch(&g_audoutIAudioOut);