add sound to sms and pce emus

pull/40/head
jean-marcharvengt 2025-02-04 23:38:08 +01:00
rodzic 53657f2aac
commit 99ff03ea62
12 zmienionych plików z 49 dodań i 30 usunięć

BIN
MCUME_pico2/.DS_Store vendored

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -19,8 +19,8 @@ include(pico_sdk_import.cmake)
#set(TARGET picovcs) #set(TARGET picovcs)
#set(TARGET picogb) #set(TARGET picogb)
#set(TARGET picopce) #set(TARGET picopce)
#set(TARGET picosms) set(TARGET picosms)
set(TARGET picogen) #set(TARGET picogen)
#set(TARGET pico5200) #set(TARGET pico5200)

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -24,7 +24,7 @@ bool show_fps = true;
bool limit_fps = true; bool limit_fps = true;
bool interlace = true; bool interlace = true;
bool frameskip = true; bool frameskip = true;
int z80_enable_mode = 2; static int z80_enable_mode = 2;
bool sn76489_enabled = true; bool sn76489_enabled = true;
extern unsigned short button_state[3]; extern unsigned short button_state[3];
@ -126,8 +126,8 @@ void gen_Step(void) {
ym2612_clock = 0; ym2612_clock = 0;
ym2612_index = 0; ym2612_index = 0;
scan_line = 0; scan_line = 0;
//if (z80_enable_mode == 1) if (z80_enable_mode == 1)
//z80_run(lines_per_frame * VDP_CYCLES_PER_LINE); z80_run(lines_per_frame * VDP_CYCLES_PER_LINE);
//printf("m(%x)\n", frame); //printf("m(%x)\n", frame);
while (scan_line < lines_per_frame) { while (scan_line < lines_per_frame) {
@ -249,6 +249,8 @@ void gen_Step(void) {
void SND_Process(void *stream, int len) { void SND_Process(void *stream, int len) {
if (audio_enabled) { if (audio_enabled) {
//if ( (z80_enable_mode == 3) && (system_clock == 0) )
// z80_run(262 * VDP_CYCLES_PER_LINE);
ym2612_run(262 * VDP_CYCLES_PER_LINE); ym2612_run(262 * VDP_CYCLES_PER_LINE);
gwenesis_SN76489_run(262 * VDP_CYCLES_PER_LINE); gwenesis_SN76489_run(262 * VDP_CYCLES_PER_LINE);
audio_sample * snd_buf = (audio_sample *)stream; audio_sample * snd_buf = (audio_sample *)stream;

Wyświetl plik

@ -6,6 +6,7 @@
extern "C" { extern "C" {
#include "pce-go/pce-go.h" #include "pce-go/pce-go.h"
#include "pce-go/pce.h" #include "pce-go/pce.h"
#include <pce-go/psg.h>
} }
#include "flash_t.h" #include "flash_t.h"
@ -16,6 +17,11 @@ void emu_KeyboardOnDown(int keymodifer, int key) {
void emu_KeyboardOnUp(int keymodifer, int key) { void emu_KeyboardOnUp(int keymodifer, int key) {
} }
#define AUDIO_SAMPLE_RATE 22050
#define AUDIO_BUFFER_LENGTH (AUDIO_SAMPLE_RATE / 60 + 1)
alignas(4) int audio_buffer[AUDIO_BUFFER_LENGTH];
void pce_Init(void) void pce_Init(void)
{ {
@ -40,13 +46,10 @@ void pce_Start(char * filename)
int size = flash_load(filename); int size = flash_load(filename);
PalettePCE(0); PalettePCE(0);
InitPCE(22050, false, (const void *)flash_start, (size_t)size); InitPCE(AUDIO_SAMPLE_RATE, true, (const void *)flash_start, (size_t)size);
#ifdef SOUND_PRESENT
#ifdef HAS_SND #ifdef HAS_SND
emu_sndInit(); emu_sndInit();
#endif
#else
#endif #endif
emu_printf("pce_Start done"); emu_printf("pce_Start done");
@ -77,12 +80,16 @@ void pce_Step(void) {
PCE.Joypad.regs[0] = buttons; PCE.Joypad.regs[0] = buttons;
//psg_update((int16_t *) audio_buffer, AUDIO_BUFFER_LENGTH, 0xff);
//i2s_dma_write(&i2s_config, (const int16_t *) audio_buffer);
//emu_DrawVsync(); //emu_DrawVsync();
} }
void SND_Process(void *stream, int len) { void SND_Process(void *stream, int len) {
// psg_update((int16*)stream, 0, len); int16_t * buf = (int16_t *) audio_buffer;
psg_update(buf, AUDIO_BUFFER_LENGTH, 0xff);
audio_sample * snd_buf = (audio_sample *)stream;
for (int h = 0; h < len*2; h += 2) {
int16_t s1 = buf[h]>>8;
int16_t s2 = buf[h+1]>>8;
*snd_buf++ = ((s1+s2)/2)+128;
}
} }

Wyświetl plik

@ -169,8 +169,11 @@ void * emu_LineBuffer(int line)
#include "AudioPlaySystem.h" #include "AudioPlaySystem.h"
AudioPlaySystem mymixer; AudioPlaySystem mymixer;
#define AUDIO_SAMPLE_RATE 22050
#define AUDIO_BUFFER_LENGTH (AUDIO_SAMPLE_RATE / 60 + 1)
void emu_sndInit() { void emu_sndInit() {
tft.begin_audio(256, mymixer.snd_Mixer); tft.begin_audio(AUDIO_BUFFER_LENGTH*2, mymixer.snd_Mixer);
mymixer.start(); mymixer.start();
} }

Wyświetl plik

@ -114,12 +114,9 @@ void sms_Start(char * filename)
#ifdef HAS_SND #ifdef HAS_SND
#ifdef SOUND_PRESENT
system_init(22050); system_init(22050);
emu_sndInit(); emu_sndInit();
#else sms.use_fm = true;
system_init(0);
#endif
#else #else
system_init(0); system_init(0);
#endif #endif
@ -150,20 +147,26 @@ void sms_Step(void)
input.pad[0] |= INPUT_BUTTON2; input.pad[0] |= INPUT_BUTTON2;
} }
// if(check_key(KEY_DEL)) input.system |= INPUT_HARD_RESET; //if (k & MASK_KEY_USER4) input.system |= INPUT_HARD_RESET;
// if(check_key(KEY_TAB)) input.system |= (IS_GG) ? INPUT_HARD_RESET : INPUT_SOFT_RESET; //if (k & MASK_KEY_USER1) input.system |= (IS_GG) ? INPUT_HARD_RESET : INPUT_SOFT_RESET;
if (k & MASK_KEY_USER2) input.system |= (IS_GG) ? INPUT_START : INPUT_PAUSE; if (k & MASK_KEY_USER1) input.pad[0] |= INPUT_BUTTON2;
//if (k & MASK_KEY_USER2) input.system |= (IS_GG) ? INPUT_START : INPUT_PAUSE;
sms_frame(0); sms_frame(0);
//emu_printi(emu_FrameSkip());
emu_DrawVsync(); emu_DrawVsync();
} }
void SND_Process(void *stream, int len) {
#ifdef SOUND_PRESENT
#ifdef HAS_SND #ifdef HAS_SND
// audio_play_sample(stream, 0, len); static int16 sndl[512];
static int16 sndr[512];
#endif #endif
void SND_Process(void *stream, int len) {
#ifdef HAS_SND
audio_sample * snd_buf = (audio_sample *)stream;
audio_play_sample(&sndl[0], &sndr[0], len);
for (int i = 0; i< len; i++ )
*snd_buf++ = ((sndl[i]>>8)+(sndr[i]>>8))/2+128;
#endif #endif
} }

Wyświetl plik

@ -5,7 +5,7 @@
#define VID_FRAME_SKIP 0x0 #define VID_FRAME_SKIP 0x0
#define TFT_VBUFFER_YCROP 0 #define TFT_VBUFFER_YCROP 0
#define SINGLELINE_RENDERING 1 #define SINGLELINE_RENDERING 1
//#define CUSTOM_SND 1 #define CUSTOM_SND 1
//#define TIMER_REND 1 //#define TIMER_REND 1
#define EXTRA_HEAP 0x10 #define EXTRA_HEAP 0x10
#define FILEBROWSER #define FILEBROWSER

Wyświetl plik

@ -322,9 +322,9 @@ void * emu_LineBuffer(int line)
#ifdef HAS_SND #ifdef HAS_SND
#include "AudioPlaySystem.h" #include "AudioPlaySystem.h"
AudioPlaySystem mymixer; AudioPlaySystem mymixer;
#define AUDIO_BUFFER_LEN (22050/50)
void emu_sndInit() { void emu_sndInit() {
tft.begin_audio(256, mymixer.snd_Mixer); tft.begin_audio(AUDIO_BUFFER_LEN*2, mymixer.snd_Mixer);
mymixer.start(); mymixer.start();
} }

Wyświetl plik

@ -3,4 +3,8 @@
#define FLASH_STORE_START 0x100000 #define FLASH_STORE_START 0x100000
#ifdef HAS_USBPIO
//#undef HAS_SND
#endif
#endif #endif