PSP2: Fix audio

This commit is contained in:
Jeffrey Pfau 2015-08-29 16:50:51 -07:00
parent d8c3306bf2
commit 20ba3d1390
2 changed files with 9 additions and 7 deletions

View File

@ -29,7 +29,6 @@ The ports are vaguely usable, but by no means should be considered stable.
* Hardware acceleration * Hardware acceleration
### PS Vita (master) ### PS Vita (master)
* Fix audio
* Make it faster * Make it faster
* Threaded renderer shim * Threaded renderer shim
* Hardware acceleration * Hardware acceleration

View File

@ -55,24 +55,27 @@ static void _mapVitaKey(struct GBAInputMap* map, int pspKey, enum GBAKey key) {
static THREAD_ENTRY _audioThread(void* context) { static THREAD_ENTRY _audioThread(void* context) {
struct GBAPSP2AudioContext* audio = (struct GBAPSP2AudioContext*) context; struct GBAPSP2AudioContext* audio = (struct GBAPSP2AudioContext*) context;
struct GBAStereoSample buffer[PSP2_AUDIO_BUFFER_SIZE]; struct GBAStereoSample buffer[PSP2_SAMPLES];
int audioPort = sceAudioOutOpenPort(PSP2_AUDIO_OUT_PORT_TYPE_MAIN, PSP2_AUDIO_BUFFER_SIZE, 48000, PSP2_AUDIO_OUT_MODE_STEREO); int audioPort = sceAudioOutOpenPort(PSP2_AUDIO_OUT_PORT_TYPE_MAIN, PSP2_SAMPLES, 48000, PSP2_AUDIO_OUT_MODE_STEREO);
while (audio->running) { while (audio->running) {
memset(buffer, 0, sizeof(buffer));
MutexLock(&audio->mutex); MutexLock(&audio->mutex);
int len = CircleBufferSize(&audio->buffer); int len = CircleBufferSize(&audio->buffer);
len /= sizeof(buffer[0]); len /= sizeof(buffer[0]);
if (len > PSP2_AUDIO_BUFFER_SIZE) { if (len > PSP2_SAMPLES) {
len = PSP2_AUDIO_BUFFER_SIZE; len = PSP2_SAMPLES;
} }
if (len > 0) { if (len > 0) {
len &= ~(PSP2_AUDIO_MIN_LEN - 1); len &= ~(PSP2_AUDIO_MIN_LEN - 1);
CircleBufferRead(&audio->buffer, buffer, len * sizeof(buffer[0])); CircleBufferRead(&audio->buffer, buffer, len * sizeof(buffer[0]));
MutexUnlock(&audio->mutex); MutexUnlock(&audio->mutex);
sceAudioOutSetConfig(audioPort, len, -1, -1);
sceAudioOutOutput(audioPort, buffer); sceAudioOutOutput(audioPort, buffer);
MutexLock(&audio->mutex); MutexLock(&audio->mutex);
} }
ConditionWait(&audio->cond, &audio->mutex);
if (CircleBufferSize(&audio->buffer) < PSP2_SAMPLES) {
ConditionWait(&audio->cond, &audio->mutex);
}
MutexUnlock(&audio->mutex); MutexUnlock(&audio->mutex);
} }
sceAudioOutReleasePort(audioPort); sceAudioOutReleasePort(audioPort);