mirror of https://github.com/encounter/SDL.git
SWITCH: add audio support
This commit is contained in:
parent
9d4ad79af1
commit
f6e5951ebf
|
@ -25,8 +25,7 @@ set(SRC_DIRS
|
||||||
src
|
src
|
||||||
src/atomic
|
src/atomic
|
||||||
src/audio
|
src/audio
|
||||||
#src/audio/switch
|
src/audio/switch
|
||||||
src/audio/dummy
|
|
||||||
src/cpuinfo
|
src/cpuinfo
|
||||||
src/events
|
src/events
|
||||||
src/file
|
src/file
|
||||||
|
|
|
@ -4235,8 +4235,6 @@ AS_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau
|
||||||
EXTRA_CFLAGS="$EXTRA_CFLAGS -isystem${DEVKITPRO}/libnx/include -I${DEVKITPRO}/portlibs/switch/include -D__SWITCH__=1"
|
EXTRA_CFLAGS="$EXTRA_CFLAGS -isystem${DEVKITPRO}/libnx/include -I${DEVKITPRO}/portlibs/switch/include -D__SWITCH__=1"
|
||||||
EXTRA_CFLAGS="$EXTRA_CFLAGS -g -O2 -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIC -ftls-model=local-exec"
|
EXTRA_CFLAGS="$EXTRA_CFLAGS -g -O2 -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIC -ftls-model=local-exec"
|
||||||
CheckDeclarationAfterStatement
|
CheckDeclarationAfterStatement
|
||||||
CheckDiskAudio
|
|
||||||
CheckDummyAudio
|
|
||||||
|
|
||||||
# Set up files for the video library
|
# Set up files for the video library
|
||||||
if test x$enable_video = xyes; then
|
if test x$enable_video = xyes; then
|
||||||
|
|
|
@ -101,6 +101,9 @@ static const AudioBootStrap *const bootstrap[] = {
|
||||||
#if SDL_AUDIO_DRIVER_EMSCRIPTEN
|
#if SDL_AUDIO_DRIVER_EMSCRIPTEN
|
||||||
&EMSCRIPTENAUDIO_bootstrap,
|
&EMSCRIPTENAUDIO_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
|
#if SDL_AUDIO_DRIVER_SWITCH
|
||||||
|
&SWITCHAUDIO_bootstrap,
|
||||||
|
#endif
|
||||||
#if SDL_AUDIO_DRIVER_JACK
|
#if SDL_AUDIO_DRIVER_JACK
|
||||||
&JACK_bootstrap,
|
&JACK_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -208,6 +208,7 @@ extern AudioBootStrap ANDROIDAUDIO_bootstrap;
|
||||||
extern AudioBootStrap PSPAUDIO_bootstrap;
|
extern AudioBootStrap PSPAUDIO_bootstrap;
|
||||||
extern AudioBootStrap EMSCRIPTENAUDIO_bootstrap;
|
extern AudioBootStrap EMSCRIPTENAUDIO_bootstrap;
|
||||||
extern AudioBootStrap OS2AUDIO_bootstrap;
|
extern AudioBootStrap OS2AUDIO_bootstrap;
|
||||||
|
extern AudioBootStrap SWITCHAUDIO_bootstrap;
|
||||||
|
|
||||||
#endif /* SDL_sysaudio_h_ */
|
#endif /* SDL_sysaudio_h_ */
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "../../SDL_internal.h"
|
||||||
|
|
||||||
|
#if SDL_AUDIO_DRIVER_SWITCH
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
|
#include "SDL_audio.h"
|
||||||
|
#include "../SDL_audio_c.h"
|
||||||
|
#include "../SDL_audiodev_c.h"
|
||||||
|
|
||||||
|
#include "SDL_switchaudio.h"
|
||||||
|
|
||||||
|
static int
|
||||||
|
SWITCHAUDIO_OpenDevice(_THIS, void *handle, const char *devname, int iscapture)
|
||||||
|
{
|
||||||
|
Result res = audoutInitialize();
|
||||||
|
if (res != 0) {
|
||||||
|
return SDL_SetError("audoutInitialize failed (0x%x)", res);
|
||||||
|
}
|
||||||
|
|
||||||
|
res = audoutStartAudioOut();
|
||||||
|
if (res != 0) {
|
||||||
|
audoutExit();
|
||||||
|
return SDL_SetError("audoutStartAudioOut failed (0x%x)", res);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->hidden = (struct SDL_PrivateAudioData *) SDL_malloc(sizeof(*this->hidden));
|
||||||
|
if (this->hidden == NULL) {
|
||||||
|
return SDL_OutOfMemory();
|
||||||
|
}
|
||||||
|
SDL_zerop(this->hidden);
|
||||||
|
|
||||||
|
switch (this->spec.format & 0xff) {
|
||||||
|
case 8:
|
||||||
|
case 16:
|
||||||
|
this->spec.format = AUDIO_S16LSB;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return SDL_SetError("Unsupported audio format");
|
||||||
|
}
|
||||||
|
|
||||||
|
this->spec.freq = 48000;
|
||||||
|
this->spec.channels = 2;
|
||||||
|
|
||||||
|
SDL_CalculateAudioSpec(&this->spec);
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
u32 size = (u32) (this->spec.size + 0xfff) & ~0xfff;
|
||||||
|
this->hidden->buffer[i] = memalign(0x1000, size);
|
||||||
|
memset(this->hidden->buffer[i], 0, size);
|
||||||
|
this->hidden->source_buffer[i].next = NULL;
|
||||||
|
this->hidden->source_buffer[i].buffer = this->hidden->buffer[i];
|
||||||
|
this->hidden->source_buffer[i].buffer_size =
|
||||||
|
(u64) this->spec.size / this->spec.channels / 2;
|
||||||
|
this->hidden->source_buffer[i].data_size = (u64) this->spec.size;
|
||||||
|
this->hidden->source_buffer[i].data_offset = (u64) 0;
|
||||||
|
audoutAppendAudioOutBuffer(&this->hidden->source_buffer[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
SWITCHAUDIO_PlayDevice(_THIS)
|
||||||
|
{
|
||||||
|
audoutAppendAudioOutBuffer(this->hidden->released_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
SWITCHAUDIO_WaitDevice(_THIS)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static Uint8
|
||||||
|
*SWITCHAUDIO_GetDeviceBuf(_THIS)
|
||||||
|
{
|
||||||
|
audoutWaitPlayFinish(&this->hidden->released_buffer,
|
||||||
|
&this->hidden->released_count, U64_MAX);
|
||||||
|
|
||||||
|
return this->hidden->released_buffer->buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
SWITCHAUDIO_CloseDevice(_THIS)
|
||||||
|
{
|
||||||
|
if (this->hidden->buffer[0]) {
|
||||||
|
free(this->hidden->buffer[0]);
|
||||||
|
}
|
||||||
|
if (this->hidden->buffer[1]) {
|
||||||
|
free(this->hidden->buffer[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
audoutStopAudioOut();
|
||||||
|
audoutExit();
|
||||||
|
|
||||||
|
SDL_free(this->hidden);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
SWITCHAUDIO_ThreadInit(_THIS)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
SWITCHAUDIO_Init(SDL_AudioDriverImpl *impl)
|
||||||
|
{
|
||||||
|
impl->OpenDevice = SWITCHAUDIO_OpenDevice;
|
||||||
|
impl->PlayDevice = SWITCHAUDIO_PlayDevice;
|
||||||
|
impl->WaitDevice = SWITCHAUDIO_WaitDevice;
|
||||||
|
impl->GetDeviceBuf = SWITCHAUDIO_GetDeviceBuf;
|
||||||
|
impl->CloseDevice = SWITCHAUDIO_CloseDevice;
|
||||||
|
impl->ThreadInit = SWITCHAUDIO_ThreadInit;
|
||||||
|
|
||||||
|
impl->OnlyHasDefaultOutputDevice = 1;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioBootStrap SWITCHAUDIO_bootstrap = {
|
||||||
|
"switch", "Nintendo Switch audio driver", SWITCHAUDIO_Init, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* SDL_AUDIO_DRIVER_SWITCH */
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_switchaudio_h_
|
||||||
|
#define SDL_switchaudio_h_
|
||||||
|
|
||||||
|
#include <switch.h>
|
||||||
|
#include "../SDL_sysaudio.h"
|
||||||
|
|
||||||
|
/* Hidden "this" pointer for the audio functions */
|
||||||
|
#define _THIS SDL_AudioDevice *this
|
||||||
|
|
||||||
|
struct SDL_PrivateAudioData
|
||||||
|
{
|
||||||
|
void *buffer[2];
|
||||||
|
AudioOutBuffer source_buffer[2];
|
||||||
|
AudioOutBuffer *released_buffer;
|
||||||
|
u32 released_count;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* SDL_switchaudio_h_ */
|
Loading…
Reference in New Issue