From 5fc80d83aa7081901756923c93ffea28f7f3751d Mon Sep 17 00:00:00 2001 From: riccardom Date: Sun, 15 May 2011 14:35:11 +0000 Subject: [PATCH] wx: Make spu mode and audio driver changeable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From Jan Bücken (nooris), #3288648 --- desmume/src/wx/wxMain.cpp | 98 ++++++++++++++++++++++++++++++++++++++- desmume/src/wx/wxMain.h | 15 +++++- 2 files changed, 109 insertions(+), 4 deletions(-) diff --git a/desmume/src/wx/wxMain.cpp b/desmume/src/wx/wxMain.cpp index 8d1ea8af3..f5b4bc9a0 100644 --- a/desmume/src/wx/wxMain.cpp +++ b/desmume/src/wx/wxMain.cpp @@ -65,6 +65,24 @@ static int nds_gap_size; static SPADInitialize PADInitialize; static bool Touch = false; +#if defined(WIN32) || defined(HAVE_LIBSOUNDTOUCH) +#define HAVE_SPUMODE_SYNCP +#endif + +enum audiodriver_enum { + AUDIODRIVER_SDL = 0, + AUDIODRIVER_DISABLE +}; + +enum spumode_enum { + SPUMODE_DUALASYNC = 0, + SPUMODE_SYNCN, + SPUMODE_SYNCZ, +#ifdef HAVE_SPUMODE_SYNCP + SPUMODE_SYNCP +#endif +}; + SoundInterface_struct *SNDCoreList[] = { &SNDDummy, &SNDSDL, @@ -157,6 +175,8 @@ DesmumeFrame::DesmumeFrame(const wxString& title) wxMenu *loads(MakeStatesSubMenu(wLoadState01)); wxMenu *layersMenu = new wxMenu; wxMenu *rotateMenu = new wxMenu; + wxMenu *audiodriverMenu = new wxMenu; + wxMenu *spumodeMenu = new wxMenu; LoadSettings(); @@ -192,6 +212,17 @@ DesmumeFrame::DesmumeFrame(const wxString& title) emulationMenu->Append(wPause, _T("&Pause\tAlt-P"), _T("Pause Emulation")); emulationMenu->Append(wReset, _T("&Reset\tAlt-R"), _T("Reset Emulation")); + emulationMenu->AppendSeparator(); + emulationMenu->AppendSubMenu(audiodriverMenu, _T("&Audio Driver")); + audiodriverMenu->AppendRadioItem(wAUDIODRIVER_SDL, _T("&SDL")); + audiodriverMenu->AppendRadioItem(wAUDIODRIVER_DISABLE, _T("&Disable Sound")); + emulationMenu->AppendSubMenu(spumodeMenu, _T("&SPU Mode")); + spumodeMenu->AppendRadioItem(wSPUMODE_DUALASYNC, _T("&Dual Asynchronous")); + spumodeMenu->AppendRadioItem(wSPUMODE_SYNCN, _T("Synchronous (&N)")); + spumodeMenu->AppendRadioItem(wSPUMODE_SYNCZ, _T("Synchronous (&Z)")); +#ifdef HAVE_SPUMODE_SYNCP + spumodeMenu->AppendRadioItem(wSPUMODE_SYNCP, _T("Synchronous (&P)")); +#endif configMenu->Append(wConfigureControls, _T("Controls")); @@ -690,8 +721,16 @@ BEGIN_EVENT_TABLE(DesmumeFrame, wxFrame) EVT_MENU(wxID_EXIT, DesmumeFrame::OnQuit) EVT_MENU(wxID_OPEN, DesmumeFrame::LoadRom) EVT_MENU(wxID_ABOUT,DesmumeFrame::OnAbout) + EVT_MENU(wPause,DesmumeFrame::pause) EVT_MENU(wReset,DesmumeFrame::reset) + + EVT_MENU_RANGE(wAUDIODRIVER_SDL,wAUDIODRIVER_DISABLE,DesmumeFrame::Modify_AudioDriver) + EVT_MENU_RANGE(wSPUMODE_DUALASYNC,wSPUMODE_SYNCZ,DesmumeFrame::Modify_SPUMode) +#ifdef HAVE_SPUMODE_SYNCP + EVT_MENU(wSPUMODE_SYNCP,DesmumeFrame::Modify_SPUMode) +#endif + EVT_MENU(wFrameCounter,DesmumeFrame::frameCounter) EVT_MENU(wFPS,DesmumeFrame::FPS) EVT_MENU(wDisplayInput,DesmumeFrame::displayInput) @@ -748,7 +787,6 @@ END_EVENT_TABLE() IMPLEMENT_APP(Desmume) - #ifdef WIN32 /* * The thread handling functions needed by the GDB stub code. @@ -799,7 +837,6 @@ void DesmumeFrame::OnOpenRecent(wxCommandEvent &event) { history->RemoveFileFromHistory(id); } - void DesmumeFrame::loadfileMenu(wxMenu *fileMenu) { wxMenu *recentMenu = new wxMenu; @@ -832,9 +869,23 @@ void DesmumeFrame::loadfileMenu(wxMenu *fileMenu) } void DesmumeFrame::loademulationMenu(wxMenu *emulationMenu) { + wxMenu *audiodriverMenu = new wxMenu; + wxMenu *spumodeMenu = new wxMenu; emulationMenu->Append(wPause, _T("&Pause\tAlt-P"), _T("Pause Emulation")); emulationMenu->Append(wReset, _T("&Reset\tAlt-R"), _T("Reset Emulation")); + emulationMenu->AppendSeparator(); + emulationMenu->AppendSubMenu(audiodriverMenu, _T("&Audio Driver")); + audiodriverMenu->AppendRadioItem(wAUDIODRIVER_SDL, _T("&SDL")); + audiodriverMenu->AppendRadioItem(wAUDIODRIVER_DISABLE, _T("&Disable Sound")); + emulationMenu->AppendSubMenu(spumodeMenu, _T("&SPU Mode")); + spumodeMenu->AppendRadioItem(wSPUMODE_DUALASYNC, _T("&Dual Asynchronous")); + spumodeMenu->AppendRadioItem(wSPUMODE_SYNCN, _T("Synchronous (&N)")); + spumodeMenu->AppendRadioItem(wSPUMODE_SYNCZ, _T("Synchronous (&Z)")); +#ifdef HAVE_SPUMODE_SYNCP + spumodeMenu->AppendRadioItem(wSPUMODE_SYNCP, _T("Synchronous (&P)")); +#endif } + void DesmumeFrame::loadrotateMenu(wxMenu *rotateMenu) { rotateMenu->AppendRadioItem(wRot0, _T("0")); @@ -843,6 +894,7 @@ void DesmumeFrame::loadrotateMenu(wxMenu *rotateMenu) rotateMenu->AppendRadioItem(wRot270, _T("270")); rotateMenu->Check(wRot0+(nds_screen_rotation_angle/90), true); } + void DesmumeFrame::loadviewMenu(wxMenu *viewMenu) { wxMenu *rotateMenu = new wxMenu; @@ -928,3 +980,45 @@ void DesmumeFrame::loadmenuBar(wxMenuBar *menuBar) loadviewMenu(viewMenu); } + +void DesmumeFrame::Modify_AudioDriver(wxCommandEvent &event) +{ + const int selection = event.GetId() - wAUDIODRIVER_SDL; + + switch (selection) { + case AUDIODRIVER_DISABLE: + SPU_ChangeSoundCore(0, 0); + osd->addLine("Audio disabled\n"); + break; + default: + case AUDIODRIVER_SDL: + SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4); + osd->addLine("Audio enabled (SDL driver)\n"); + break; + } +} + +void DesmumeFrame::Modify_SPUMode(wxCommandEvent &event) +{ + const int selection = event.GetId() - wSPUMODE_DUALASYNC; + uint syncMode, syncMethod; + + switch (selection) { + case SPUMODE_SYNCN: + case SPUMODE_SYNCZ: +#ifdef HAVE_SPUMODE_SYNCP + case SPUMODE_SYNCP: +#endif + syncMode = 1; + syncMethod = selection - 1; + break; + + // Default to DualASync mode on invalid selection + default: + case SPUMODE_DUALASYNC: + syncMode = 0; + syncMethod = 0; + break; + } + SPU_SetSynchMode(syncMode, syncMethod); +} diff --git a/desmume/src/wx/wxMain.h b/desmume/src/wx/wxMain.h index f8bd5e203..04b59bf58 100644 --- a/desmume/src/wx/wxMain.h +++ b/desmume/src/wx/wxMain.h @@ -51,6 +51,14 @@ enum wRot90, wRot180, wRot270, + wAUDIODRIVER_SDL, + wAUDIODRIVER_DISABLE, + wSPUMODE_DUALASYNC, + wSPUMODE_SYNCN, + wSPUMODE_SYNCZ, +#ifdef HAVE_LIBSOUNDTOUCH + wSPUMODE_SYNCP, +#endif /* stupid enums: these two should be the at the end */ wLoadState01, wSaveState01 = wLoadState01+20 @@ -88,7 +96,7 @@ public: void onPaint(wxPaintEvent &event); void onIdle(wxIdleEvent &event); void pause(wxCommandEvent& event); - void reset(wxCommandEvent& event){NDS_Reset();} + void reset(wxCommandEvent& event){NDS_Reset();}; void frameCounter(wxCommandEvent& event); void FPS(wxCommandEvent& event); void displayInput(wxCommandEvent& event); @@ -152,6 +160,8 @@ public: bool SaveSettings(); void OnClose(wxCloseEvent &event); void OnOpenRecent(wxCommandEvent &event); + void Modify_AudioDriver(wxCommandEvent& event); + void Modify_SPUMode(wxCommandEvent& event); private: void loadfileMenu(wxMenu *fileMenu); @@ -163,6 +173,7 @@ private: void loadviewMenu(wxMenu *viewMenu); void loadrotateMenu(wxMenu *rotateMenu); void loademulationMenu(wxMenu *emulationMenu); + struct NDS_fw_config_data fw_config; wxFileHistory* history; #ifdef GDB_STUB @@ -174,4 +185,4 @@ private: struct armcpu_ctrl_iface *arm7_ctrl_iface; #endif DECLARE_EVENT_TABLE() -}; \ No newline at end of file +};