mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 20:42:44 +02:00
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.
This commit is contained in:
parent
517c76c05c
commit
6dd76f6288
@ -28,11 +28,11 @@ typedef struct AudioOutBuffer AudioOutBuffer;
|
|||||||
|
|
||||||
struct AudioOutBuffer
|
struct AudioOutBuffer
|
||||||
{
|
{
|
||||||
AudioOutBuffer* next; ///< Next buffer.
|
AudioOutBuffer* next; ///< Next buffer. (Unused)
|
||||||
void* buffer; ///< Sample buffer (aligned to 0x1000 bytes).
|
void* buffer; ///< Sample buffer (aligned to 0x1000 bytes).
|
||||||
u64 buffer_size; ///< Sample buffer size.
|
u64 buffer_size; ///< Sample buffer size.
|
||||||
u64 data_size; ///< Size of data inside the buffer.
|
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);
|
Result audoutInitialize(void);
|
||||||
@ -48,12 +48,20 @@ Result audoutGetReleasedAudioOutBuffer(AudioOutBuffer *Buffer, u32 *ReleasedBuff
|
|||||||
Result audoutContainsAudioOutBuffer(AudioOutBuffer *Buffer, bool *ContainsBuffer);
|
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 source AudioOutBuffer containing the source sample data to be played.
|
||||||
* @param released AudioOutBuffer to receive the last played buffer.
|
* @param released AudioOutBuffer to receive the last played buffer.
|
||||||
*/
|
*/
|
||||||
Result audoutPlayBuffer(AudioOutBuffer *source, AudioOutBuffer *released);
|
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.
|
/// These return the state associated with the currently active audio output device.
|
||||||
u32 audoutGetSampleRate(void); ///< Supported sample rate (48000Hz).
|
u32 audoutGetSampleRate(void); ///< Supported sample rate (48000Hz).
|
||||||
u32 audoutGetChannelCount(void); ///< Supported channel count (2 channels).
|
u32 audoutGetChannelCount(void); ///< Supported channel count (2 channels).
|
||||||
|
@ -82,26 +82,32 @@ AudioOutState audoutGetDeviceState(void) {
|
|||||||
return g_deviceState;
|
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) {
|
Result audoutPlayBuffer(AudioOutBuffer *source, AudioOutBuffer *released) {
|
||||||
// Try to push the supplied buffer to the audio output device
|
// Try to push the supplied buffer to the audio output device
|
||||||
Result do_append = audoutAppendAudioOutBuffer(source);
|
Result do_append = audoutAppendAudioOutBuffer(source);
|
||||||
|
|
||||||
if (R_SUCCEEDED(do_append))
|
if (R_SUCCEEDED(do_append))
|
||||||
{
|
{
|
||||||
// Wait on the buffer event handle
|
audoutWaitPlayFinish(released, U64_MAX);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return do_append;
|
return do_append;
|
||||||
@ -319,7 +325,7 @@ Result audoutAppendAudioOutBuffer(AudioOutBuffer *Buffer) {
|
|||||||
|
|
||||||
raw->magic = SFCI_MAGIC;
|
raw->magic = SFCI_MAGIC;
|
||||||
raw->cmd_id = 3;
|
raw->cmd_id = 3;
|
||||||
raw->tag = (u64)&Buffer;
|
raw->tag = (u64)Buffer;
|
||||||
|
|
||||||
Result rc = serviceIpcDispatch(&g_audoutIAudioOut);
|
Result rc = serviceIpcDispatch(&g_audoutIAudioOut);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user