mirror of
https://github.com/libretro/RetroArch
synced 2025-04-07 13:23:32 +00:00
(WiiU) use some more direct callback for audio updates and added safety into it
This commit is contained in:
parent
797ef01b85
commit
b3eb8ec3be
@ -63,20 +63,29 @@ typedef struct
|
|||||||
//#define ax_audio_ticks_to_samples(ticks) (((ticks) * 64) / 82875)
|
//#define ax_audio_ticks_to_samples(ticks) (((ticks) * 64) / 82875)
|
||||||
//#define ax_audio_samples_to_ticks(samples) (((samples) * 82875) / 64)
|
//#define ax_audio_samples_to_ticks(samples) (((samples) * 82875) / 64)
|
||||||
|
|
||||||
AXResult ax_aux_callback(void* data, ax_audio_t* ax)
|
static volatile ax_audio_t *wiiu_cb_ax = NULL;
|
||||||
|
void wiiu_ax_callback(void)
|
||||||
{
|
{
|
||||||
OSUninterruptibleSpinLock_Acquire(&ax->spinlock);
|
//possibly called before unregister
|
||||||
//buffer underrun, stop playback to let if fill up
|
if(wiiu_cb_ax == NULL)
|
||||||
if(ax->written < AX_AUDIO_SAMPLE_MIN)
|
return;
|
||||||
AXSetMultiVoiceState(ax->mvoice, AX_VOICE_STATE_STOPPED);
|
|
||||||
//make sure to update written value if voice is running
|
|
||||||
if(AXIsMultiVoiceRunning(ax->mvoice))
|
|
||||||
ax->written -= (ax->written < AX_AUDIO_SAMPLE_COUNT ? ax->written : AX_AUDIO_SAMPLE_COUNT);
|
|
||||||
|
|
||||||
OSUninterruptibleSpinLock_Release(&ax->spinlock);
|
ax_audio_t *ax = (ax_audio_t*)wiiu_cb_ax;
|
||||||
return AX_RESULT_SUCCESS;
|
if(AXIsMultiVoiceRunning(ax->mvoice))
|
||||||
|
{
|
||||||
|
if(OSUninterruptibleSpinLock_TryAcquire(&ax->spinlock))
|
||||||
|
{
|
||||||
|
//buffer underrun, stop playback to let it fill up
|
||||||
|
if(ax->written < AX_AUDIO_SAMPLE_MIN)
|
||||||
|
AXSetMultiVoiceState(ax->mvoice, AX_VOICE_STATE_STOPPED);
|
||||||
|
else //make sure to update written value if voice is running
|
||||||
|
ax->written -= AX_AUDIO_SAMPLE_COUNT;
|
||||||
|
OSUninterruptibleSpinLock_Release(&ax->spinlock);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void AXRegisterFrameCallback(void *cb);
|
||||||
static void* ax_audio_init(const char* device, unsigned rate, unsigned latency)
|
static void* ax_audio_init(const char* device, unsigned rate, unsigned latency)
|
||||||
{
|
{
|
||||||
ax_audio_t* ax = (ax_audio_t*)calloc(1, sizeof(ax_audio_t));
|
ax_audio_t* ax = (ax_audio_t*)calloc(1, sizeof(ax_audio_t));
|
||||||
@ -135,23 +144,26 @@ static void* ax_audio_init(const char* device, unsigned rate, unsigned latency)
|
|||||||
|
|
||||||
config_get_ptr()->audio.out_rate = AX_AUDIO_RATE;
|
config_get_ptr()->audio.out_rate = AX_AUDIO_RATE;
|
||||||
|
|
||||||
AXRegisterAuxCallback(AX_DEVICE_TYPE_DRC, 0, 0, (AXAuxCallback)ax_aux_callback, ax);
|
|
||||||
|
|
||||||
OSInitSpinLock(&ax->spinlock);
|
OSInitSpinLock(&ax->spinlock);
|
||||||
|
|
||||||
|
wiiu_cb_ax = ax;
|
||||||
|
AXRegisterFrameCallback(wiiu_ax_callback);
|
||||||
|
|
||||||
return ax;
|
return ax;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ax_audio_free(void* data)
|
static void ax_audio_free(void* data)
|
||||||
{
|
{
|
||||||
ax_audio_t* ax = (ax_audio_t*)data;
|
ax_audio_t* ax = (ax_audio_t*)data;
|
||||||
|
wiiu_cb_ax = NULL;
|
||||||
|
|
||||||
AXRegisterAuxCallback(AX_DEVICE_TYPE_DRC, 0, 0, NULL, NULL);
|
AXRegisterFrameCallback(NULL);
|
||||||
AXFreeMultiVoice(ax->mvoice);
|
AXFreeMultiVoice(ax->mvoice);
|
||||||
|
AXQuit();
|
||||||
|
|
||||||
MEM1_free(ax->buffer_l);
|
MEM1_free(ax->buffer_l);
|
||||||
MEM1_free(ax->buffer_r);
|
MEM1_free(ax->buffer_r);
|
||||||
free(ax);
|
free(ax);
|
||||||
AXQuit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ax_audio_stop(void* data)
|
static bool ax_audio_stop(void* data)
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
EXPORT_BEGIN(sndcore2.rpl);
|
EXPORT_BEGIN(sndcore2.rpl);
|
||||||
|
|
||||||
#include "../rpl/libsndcore2/exports.h"
|
#include "../rpl/libsndcore2/exports.h"
|
||||||
|
|
||||||
|
EXPORT(AXRegisterFrameCallback);
|
||||||
|
|
||||||
EXPORT(AXAcquireMultiVoice);
|
EXPORT(AXAcquireMultiVoice);
|
||||||
EXPORT(AXSetMultiVoiceDeviceMix);
|
EXPORT(AXSetMultiVoiceDeviceMix);
|
||||||
EXPORT(AXSetMultiVoiceOffsets);
|
EXPORT(AXSetMultiVoiceOffsets);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user