mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
support multiple sound drivers
This commit is contained in:
parent
636d5f257c
commit
df92fbd1f2
8 changed files with 55 additions and 58 deletions
5
Makefile
5
Makefile
|
@ -27,7 +27,7 @@ CFLAGS += -Iplatform/linux/
|
||||||
LDLIBS += -lm -lpng
|
LDLIBS += -lm -lpng
|
||||||
|
|
||||||
# tmp
|
# tmp
|
||||||
CFLAGS += `sdl-config --cflags`
|
CFLAGS += `sdl-config --cflags` -DHAVE_SDL
|
||||||
LDLIBS += `sdl-config --libs`
|
LDLIBS += `sdl-config --libs`
|
||||||
|
|
||||||
all: PicoDrive
|
all: PicoDrive
|
||||||
|
@ -45,7 +45,8 @@ OBJS += platform/common/main.o platform/common/emu.o platform/common/menu_pico.o
|
||||||
OBJS += platform/libpicofe/input.o platform/libpicofe/readpng.o \
|
OBJS += platform/libpicofe/input.o platform/libpicofe/readpng.o \
|
||||||
platform/libpicofe/fonts.o platform/libpicofe/linux/in_evdev.o \
|
platform/libpicofe/fonts.o platform/libpicofe/linux/in_evdev.o \
|
||||||
platform/libpicofe/linux/plat.o platform/libpicofe/linux/sndout_oss.o \
|
platform/libpicofe/linux/plat.o platform/libpicofe/linux/sndout_oss.o \
|
||||||
platform/libpicofe/plat_sdl.o platform/libpicofe/in_sdl.o
|
platform/libpicofe/plat_sdl.o platform/libpicofe/in_sdl.o \
|
||||||
|
platform/libpicofe/sndout.o platform/libpicofe/sndout_sdl.o
|
||||||
|
|
||||||
OBJS += platform/libpicofe/plat_dummy.o
|
OBJS += platform/libpicofe/plat_dummy.o
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "../libpicofe/posix.h"
|
#include "../libpicofe/posix.h"
|
||||||
#include "../libpicofe/input.h"
|
#include "../libpicofe/input.h"
|
||||||
#include "../libpicofe/fonts.h"
|
#include "../libpicofe/fonts.h"
|
||||||
|
#include "../libpicofe/sndout.h"
|
||||||
#include "../libpicofe/lprintf.h"
|
#include "../libpicofe/lprintf.h"
|
||||||
#include "../libpicofe/plat.h"
|
#include "../libpicofe/plat.h"
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
|
@ -45,6 +46,8 @@ int pico_pen_x = 320/2, pico_pen_y = 240/2;
|
||||||
int pico_inp_mode = 0;
|
int pico_inp_mode = 0;
|
||||||
int engineState = PGS_Menu;
|
int engineState = PGS_Menu;
|
||||||
|
|
||||||
|
static short __attribute__((aligned(4))) sndBuffer[2*44100/50];
|
||||||
|
|
||||||
/* tmp buff to reduce stack usage for plats with small stack */
|
/* tmp buff to reduce stack usage for plats with small stack */
|
||||||
static char static_buff[512];
|
static char static_buff[512];
|
||||||
const char *rom_fname_reload;
|
const char *rom_fname_reload;
|
||||||
|
@ -1418,6 +1421,8 @@ void emu_init(void)
|
||||||
PicoMessage = plat_status_msg_busy_next;
|
PicoMessage = plat_status_msg_busy_next;
|
||||||
PicoMCDopenTray = emu_tray_open;
|
PicoMCDopenTray = emu_tray_open;
|
||||||
PicoMCDcloseTray = emu_tray_close;
|
PicoMCDcloseTray = emu_tray_close;
|
||||||
|
|
||||||
|
sndout_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void emu_finish(void)
|
void emu_finish(void)
|
||||||
|
@ -1440,6 +1445,42 @@ void emu_finish(void)
|
||||||
pprof_finish();
|
pprof_finish();
|
||||||
|
|
||||||
PicoExit();
|
PicoExit();
|
||||||
|
sndout_exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void snd_write_nonblocking(int len)
|
||||||
|
{
|
||||||
|
sndout_write_nb(PsndOut, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
void emu_sound_start(void)
|
||||||
|
{
|
||||||
|
PsndOut = NULL;
|
||||||
|
|
||||||
|
if (currentConfig.EmuOpt & EOPT_EN_SOUND)
|
||||||
|
{
|
||||||
|
int is_stereo = (PicoOpt & POPT_EN_STEREO) ? 1 : 0;
|
||||||
|
|
||||||
|
PsndRerate(Pico.m.frame_count ? 1 : 0);
|
||||||
|
|
||||||
|
printf("starting audio: %i len: %i stereo: %i, pal: %i\n",
|
||||||
|
PsndRate, PsndLen, is_stereo, Pico.m.pal);
|
||||||
|
sndout_start(PsndRate, is_stereo);
|
||||||
|
PicoWriteSound = snd_write_nonblocking;
|
||||||
|
plat_update_volume(0, 0);
|
||||||
|
memset(sndBuffer, 0, sizeof(sndBuffer));
|
||||||
|
PsndOut = sndBuffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void emu_sound_stop(void)
|
||||||
|
{
|
||||||
|
sndout_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void emu_sound_wait(void)
|
||||||
|
{
|
||||||
|
sndout_wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void skip_frame(int do_audio)
|
static void skip_frame(int do_audio)
|
||||||
|
@ -1477,6 +1518,7 @@ void emu_loop(void)
|
||||||
|
|
||||||
plat_video_loop_prepare();
|
plat_video_loop_prepare();
|
||||||
pemu_loop_prep();
|
pemu_loop_prep();
|
||||||
|
pemu_sound_start();
|
||||||
|
|
||||||
/* number of ticks per frame */
|
/* number of ticks per frame */
|
||||||
if (Pico.m.pal) {
|
if (Pico.m.pal) {
|
||||||
|
@ -1641,6 +1683,7 @@ void emu_loop(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
pemu_loop_end();
|
pemu_loop_end();
|
||||||
|
emu_sound_stop();
|
||||||
|
|
||||||
// pemu_loop_end() might want to do 1 frame for bg image,
|
// pemu_loop_end() might want to do 1 frame for bg image,
|
||||||
// so free CD buffer here
|
// so free CD buffer here
|
||||||
|
|
|
@ -149,6 +149,11 @@ void emu_get_game_name(char *str150);
|
||||||
void emu_set_fastforward(int set_on);
|
void emu_set_fastforward(int set_on);
|
||||||
void emu_status_msg(const char *format, ...);
|
void emu_status_msg(const char *format, ...);
|
||||||
|
|
||||||
|
/* default sound code */
|
||||||
|
void emu_sound_start(void);
|
||||||
|
void emu_sound_stop(void);
|
||||||
|
void emu_sound_wait(void);
|
||||||
|
|
||||||
/* used by some (but not all) platforms */
|
/* used by some (but not all) platforms */
|
||||||
void emu_cmn_forced_frame(int no_scale, int do_emu);
|
void emu_cmn_forced_frame(int no_scale, int do_emu);
|
||||||
|
|
||||||
|
@ -164,8 +169,6 @@ void pemu_forced_frame(int no_scale, int do_emu); // ..to g_menubg_src_ptr
|
||||||
void pemu_finalize_frame(const char *fps, const char *notice_msg);
|
void pemu_finalize_frame(const char *fps, const char *notice_msg);
|
||||||
|
|
||||||
void pemu_sound_start(void);
|
void pemu_sound_start(void);
|
||||||
void pemu_sound_stop(void);
|
|
||||||
void pemu_sound_wait(void);
|
|
||||||
|
|
||||||
void plat_early_init(void);
|
void plat_early_init(void);
|
||||||
void plat_init(void);
|
void plat_init(void);
|
||||||
|
|
|
@ -726,10 +726,10 @@ static void mplayer_loop(void)
|
||||||
PDebugZ80Frame();
|
PDebugZ80Frame();
|
||||||
if (in_menu_wait_any(NULL, 0) & PBTN_MA3)
|
if (in_menu_wait_any(NULL, 0) & PBTN_MA3)
|
||||||
break;
|
break;
|
||||||
pemu_sound_wait();
|
emu_sound_wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
pemu_sound_stop();
|
emu_sound_stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw_text_debug(const char *str, int skip, int from)
|
static void draw_text_debug(const char *str, int skip, int from)
|
||||||
|
|
|
@ -198,9 +198,6 @@ void plat_init(void)
|
||||||
// use buffer2 for menubg to save mem (using only buffers 0, 1 in menu)
|
// use buffer2 for menubg to save mem (using only buffers 0, 1 in menu)
|
||||||
g_menubg_ptr = gp2x_screens[2];
|
g_menubg_ptr = gp2x_screens[2];
|
||||||
|
|
||||||
// snd
|
|
||||||
sndout_oss_init();
|
|
||||||
|
|
||||||
if (gp2x_dev_id == GP2X_DEV_CAANOO)
|
if (gp2x_dev_id == GP2X_DEV_CAANOO)
|
||||||
in_set_config(in_name_to_id("evdev:pollux-analog"), IN_CFG_KEY_NAMES,
|
in_set_config(in_name_to_id("evdev:pollux-analog"), IN_CFG_KEY_NAMES,
|
||||||
caanoo_keys, sizeof(caanoo_keys));
|
caanoo_keys, sizeof(caanoo_keys));
|
||||||
|
@ -227,7 +224,5 @@ void plat_finish(void)
|
||||||
dummy_finish();
|
dummy_finish();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sndout_oss_exit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 20b143089cc395dbcd51cac516a9e36f4ab6f5ac
|
Subproject commit 26d3ca0d29e87a14943d29fcafc93da753df60cd
|
|
@ -11,7 +11,6 @@
|
||||||
|
|
||||||
#include "../libpicofe/menu.h"
|
#include "../libpicofe/menu.h"
|
||||||
#include "../libpicofe/plat.h"
|
#include "../libpicofe/plat.h"
|
||||||
#include "../libpicofe/linux/sndout_oss.h"
|
|
||||||
#include "../common/emu.h"
|
#include "../common/emu.h"
|
||||||
#include "../common/arm_utils.h"
|
#include "../common/arm_utils.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
@ -19,7 +18,6 @@
|
||||||
#include <pico/pico_int.h>
|
#include <pico/pico_int.h>
|
||||||
|
|
||||||
|
|
||||||
static short __attribute__((aligned(4))) sndBuffer[2*44100/50];
|
|
||||||
const char *renderer_names[] = { "16bit accurate", " 8bit accurate", " 8bit fast", NULL };
|
const char *renderer_names[] = { "16bit accurate", " 8bit accurate", " 8bit fast", NULL };
|
||||||
const char *renderer_names32x[] = { "accurate", "faster", "fastest", NULL };
|
const char *renderer_names32x[] = { "accurate", "faster", "fastest", NULL };
|
||||||
enum renderer_types { RT_16BIT, RT_8BIT_ACC, RT_8BIT_FAST, RT_COUNT };
|
enum renderer_types { RT_16BIT, RT_8BIT_ACC, RT_8BIT_FAST, RT_COUNT };
|
||||||
|
@ -209,43 +207,9 @@ void pemu_forced_frame(int no_scale, int do_emu)
|
||||||
g_menubg_src_ptr = g_screen_ptr;
|
g_menubg_src_ptr = g_screen_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void oss_write_nonblocking(int len)
|
|
||||||
{
|
|
||||||
// sndout_oss_can_write() is not reliable, only use with no_frmlimit
|
|
||||||
if ((currentConfig.EmuOpt & EOPT_NO_FRMLIMIT) && !sndout_oss_can_write(len))
|
|
||||||
return;
|
|
||||||
|
|
||||||
sndout_oss_write_nb(PsndOut, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pemu_sound_start(void)
|
void pemu_sound_start(void)
|
||||||
{
|
{
|
||||||
PsndOut = NULL;
|
emu_sound_start();
|
||||||
|
|
||||||
if (currentConfig.EmuOpt & EOPT_EN_SOUND)
|
|
||||||
{
|
|
||||||
int is_stereo = (PicoOpt & POPT_EN_STEREO) ? 1 : 0;
|
|
||||||
|
|
||||||
PsndRerate(Pico.m.frame_count ? 1 : 0);
|
|
||||||
|
|
||||||
printf("starting audio: %i len: %i stereo: %i, pal: %i\n",
|
|
||||||
PsndRate, PsndLen, is_stereo, Pico.m.pal);
|
|
||||||
sndout_oss_start(PsndRate, is_stereo, 1);
|
|
||||||
sndout_oss_setvol(currentConfig.volume, currentConfig.volume);
|
|
||||||
PicoWriteSound = oss_write_nonblocking;
|
|
||||||
plat_update_volume(0, 0);
|
|
||||||
memset(sndBuffer, 0, sizeof(sndBuffer));
|
|
||||||
PsndOut = sndBuffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void pemu_sound_stop(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void pemu_sound_wait(void)
|
|
||||||
{
|
|
||||||
// don't need to do anything, writes will block by themselves
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void plat_debug_cat(char *str)
|
void plat_debug_cat(char *str)
|
||||||
|
@ -262,14 +226,10 @@ void pemu_loop_prep(void)
|
||||||
{
|
{
|
||||||
apply_renderer();
|
apply_renderer();
|
||||||
osd_text = osd_text16;
|
osd_text = osd_text16;
|
||||||
|
|
||||||
pemu_sound_start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void pemu_loop_end(void)
|
void pemu_loop_end(void)
|
||||||
{
|
{
|
||||||
pemu_sound_stop();
|
|
||||||
|
|
||||||
/* do one more frame for menu bg */
|
/* do one more frame for menu bg */
|
||||||
pemu_forced_frame(0, 1);
|
pemu_forced_frame(0, 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
|
|
||||||
#include "../libpicofe/menu.h"
|
#include "../libpicofe/menu.h"
|
||||||
#include "../libpicofe/input.h"
|
#include "../libpicofe/input.h"
|
||||||
#include "../libpicofe/linux/sndout_oss.h"
|
|
||||||
#include "../common/emu.h"
|
#include "../common/emu.h"
|
||||||
#include "../common/input_pico.h"
|
#include "../common/input_pico.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
@ -342,9 +341,6 @@ void plat_init(void)
|
||||||
memset(g_screen_ptr, 0, g_screen_width * g_screen_height * 2);
|
memset(g_screen_ptr, 0, g_screen_width * g_screen_height * 2);
|
||||||
xlib_init();
|
xlib_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// snd
|
|
||||||
sndout_oss_init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void plat_finish(void)
|
void plat_finish(void)
|
||||||
|
@ -354,7 +350,6 @@ void plat_finish(void)
|
||||||
#else
|
#else
|
||||||
free(g_screen_ptr);
|
free(g_screen_ptr);
|
||||||
#endif
|
#endif
|
||||||
sndout_oss_exit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* misc */
|
/* misc */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue