music controlled by asm and jukebox volume slider

This commit is contained in:
Nikhil Narayana 2023-08-19 11:59:52 -07:00
commit 4c26ee2c40
No known key found for this signature in database
GPG key ID: 1B34839FA8D6245E
14 changed files with 353 additions and 50 deletions

View file

@ -1021,6 +1021,11 @@ C208D698 00000005 #Recording/GetLCancelStatus/GetLCancelStatus.asm
C206C324 00000002 #Recording/GetLCancelStatus/ResetLCancelStatus.asm
38600000 987E25FF
807E00B0 00000000
C21A4CB4 00000004 #Common/AllocBuffer.asm
38600080 3D808037
618CF1E4 7D8903A6
4E800421 906DAFC4
38000000 00000000
C20055F8 0000000F #Common/GetIsFollower.asm
7C0802A6 90010004
9421FF20 BE8100B0
@ -2040,11 +2045,6 @@ BA8100B0 800100E4
800100E4 382100E0
7C0803A6 2C1E0000
60000000 00000000
C21A4CB4 00000004 #Online/Core/EXIFileLoad/AllocBuffer.asm
38600080 3D808037
618CF1E4 7D8903A6
4E800421 906DAFC4
38000000 00000000
C20163FC 0000001B #Online/Core/EXIFileLoad/GetFileSize.asm
7C7E1B78 7C0802A6
90010004 9421FF20
@ -2194,6 +2194,63 @@ C2019608 0000000F #Online/Core/Hacks/PreventPadAlarmDuringRollback.asm
618C9618 7D8903A6
4E800420 38600000
60000000 00000000
C238E910 0000001A #Online/Core/Music/StartSong.asm
7C0802A6 90010004
9421FF54 BE81007C
7C7E1B78 3D808034
618C7364 7D8903A6
4E800421 7C7D1B78
7FC3F378 38810008
3D808033 618C7C60
7D8903A6 4E800421
2C030000 41820044
3BE10048 3BFF001F
57FF0034 386000D6
987F0000 80610038
907F0001 8061003C
907F0005 7FE3FB78
38800009 38A00001
3D808000 618C55F0
7D8903A6 4E800421
38610008 3D808033
618C7CD4 7D8903A6
4E800421 7FA3EB78
3D808034 618C738C
7D8903A6 4E800421
7FC3F378 BA81007C
800100B0 382100AC
7C0803A6 800DA998
60000000 00000000
C20236EC 0000000B #Online/Core/Music/Stop.asm
7C0802A6 90010004
9421FF9C BE810034
3BE10008 3BFF001F
57FF0034 386000D7
987F0000 7FE3FB78
38800001 38A00001
3D808000 618C55F0
7D8903A6 4E800421
BA810034 80010068
38210064 7C0803A6
38000000 00000000
C20249F0 00000011 #Online/Core/Music/VolumeChange.asm
4800000C 4E800021
00000000 900D81E8
7C0802A6 90010004
9421FF9C BE810034
4BFFFFE5 7FC802A6
808D81E8 807E0000
7C032000 4182003C
909E0000 3BE10008
3BFF001F 57FF0034
386000D8 987F0000
989F0001 7FE3FB78
38800002 38A00001
3D808000 618C55F0
7D8903A6 4E800421
BA810034 80010068
38210064 7C0803A6
60000000 00000000
C21D4578 00000003 #Online/Core/PreventFileAlarms/FreezeStadium.asm
FFE00890 3D80801D
618C4FD8 7D8903A6

View file

@ -1020,6 +1020,11 @@ C208D698 00000005 #Recording/GetLCancelStatus/GetLCancelStatus.asm
C206C324 00000002 #Recording/GetLCancelStatus/ResetLCancelStatus.asm
38600000 987E25FF
807E00B0 00000000
C21A4CB4 00000004 #Common/AllocBuffer.asm
38600080 3D808037
618CF1E4 7D8903A6
4E800421 906DAFC4
38000000 00000000
C20055F8 0000000F #Common/GetIsFollower.asm
7C0802A6 90010004
9421FF20 BE8100B0
@ -2039,11 +2044,6 @@ BA8100B0 800100E4
800100E4 382100E0
7C0803A6 2C1E0000
60000000 00000000
C21A4CB4 00000004 #Online/Core/EXIFileLoad/AllocBuffer.asm
38600080 3D808037
618CF1E4 7D8903A6
4E800421 906DAFC4
38000000 00000000
C20163FC 0000001B #Online/Core/EXIFileLoad/GetFileSize.asm
7C7E1B78 7C0802A6
90010004 9421FF20
@ -2193,6 +2193,63 @@ C2019608 0000000F #Online/Core/Hacks/PreventPadAlarmDuringRollback.asm
618C9618 7D8903A6
4E800420 38600000
60000000 00000000
C238E910 0000001A #Online/Core/Music/StartSong.asm
7C0802A6 90010004
9421FF54 BE81007C
7C7E1B78 3D808034
618C7364 7D8903A6
4E800421 7C7D1B78
7FC3F378 38810008
3D808033 618C7C60
7D8903A6 4E800421
2C030000 41820044
3BE10048 3BFF001F
57FF0034 386000D6
987F0000 80610038
907F0001 8061003C
907F0005 7FE3FB78
38800009 38A00001
3D808000 618C55F0
7D8903A6 4E800421
38610008 3D808033
618C7CD4 7D8903A6
4E800421 7FA3EB78
3D808034 618C738C
7D8903A6 4E800421
7FC3F378 BA81007C
800100B0 382100AC
7C0803A6 800DA998
60000000 00000000
C20236EC 0000000B #Online/Core/Music/Stop.asm
7C0802A6 90010004
9421FF9C BE810034
3BE10008 3BFF001F
57FF0034 386000D7
987F0000 7FE3FB78
38800001 38A00001
3D808000 618C55F0
7D8903A6 4E800421
BA810034 80010068
38210064 7C0803A6
38000000 00000000
C20249F0 00000011 #Online/Core/Music/VolumeChange.asm
4800000C 4E800021
00000000 900D81E8
7C0802A6 90010004
9421FF9C BE810034
4BFFFFE5 7FC802A6
808D81E8 807E0000
7C032000 4182003C
909E0000 3BE10008
3BFF001F 57FF0034
386000D8 987F0000
989F0001 7FE3FB78
38800002 38A00001
3D808000 618C55F0
7D8903A6 4E800421
BA810034 80010068
38210064 7C0803A6
60000000 00000000
C21D4578 00000003 #Online/Core/PreventFileAlarms/FreezeStadium.asm
FFE00890 3D80801D
618C4FD8 7D8903A6

View file

@ -1021,6 +1021,11 @@ C208D698 00000005 #Recording/GetLCancelStatus/GetLCancelStatus.asm
C206C324 00000002 #Recording/GetLCancelStatus/ResetLCancelStatus.asm
38600000 987E25FF
807E00B0 00000000
C21A4CB4 00000004 #Common/AllocBuffer.asm
38600080 3D808037
618CF1E4 7D8903A6
4E800421 906DAFC4
38000000 00000000
C20055F8 0000000F #Common/GetIsFollower.asm
7C0802A6 90010004
9421FF20 BE8100B0
@ -2040,11 +2045,6 @@ BA8100B0 800100E4
800100E4 382100E0
7C0803A6 2C1E0000
60000000 00000000
C21A4CB4 00000004 #Online/Core/EXIFileLoad/AllocBuffer.asm
38600080 3D808037
618CF1E4 7D8903A6
4E800421 906DAFC4
38000000 00000000
C20163FC 0000001B #Online/Core/EXIFileLoad/GetFileSize.asm
7C7E1B78 7C0802A6
90010004 9421FF20
@ -2194,6 +2194,63 @@ C2019608 0000000F #Online/Core/Hacks/PreventPadAlarmDuringRollback.asm
618C9618 7D8903A6
4E800420 38600000
60000000 00000000
C238E910 0000001A #Online/Core/Music/StartSong.asm
7C0802A6 90010004
9421FF54 BE81007C
7C7E1B78 3D808034
618C7364 7D8903A6
4E800421 7C7D1B78
7FC3F378 38810008
3D808033 618C7C60
7D8903A6 4E800421
2C030000 41820044
3BE10048 3BFF001F
57FF0034 386000D6
987F0000 80610038
907F0001 8061003C
907F0005 7FE3FB78
38800009 38A00001
3D808000 618C55F0
7D8903A6 4E800421
38610008 3D808033
618C7CD4 7D8903A6
4E800421 7FA3EB78
3D808034 618C738C
7D8903A6 4E800421
7FC3F378 BA81007C
800100B0 382100AC
7C0803A6 800DA998
60000000 00000000
C20236EC 0000000B #Online/Core/Music/Stop.asm
7C0802A6 90010004
9421FF9C BE810034
3BE10008 3BFF001F
57FF0034 386000D7
987F0000 7FE3FB78
38800001 38A00001
3D808000 618C55F0
7D8903A6 4E800421
BA810034 80010068
38210064 7C0803A6
38000000 00000000
C20249F0 00000011 #Online/Core/Music/VolumeChange.asm
4800000C 4E800021
00000000 900D81E8
7C0802A6 90010004
9421FF9C BE810034
4BFFFFE5 7FC802A6
808D81E8 807E0000
7C032000 4182003C
909E0000 3BE10008
3BFF001F 57FF0034
386000D8 987F0000
989F0001 7FE3FB78
38800002 38A00001
3D808000 618C55F0
7D8903A6 4E800421
BA810034 80010068
38210064 7C0803A6
60000000 00000000
C21D4578 00000003 #Online/Core/PreventFileAlarms/FreezeStadium.asm
FFE00890 3D80801D
618C4FD8 7D8903A6

View file

@ -1020,6 +1020,11 @@ C208D698 00000005 #Recording/GetLCancelStatus/GetLCancelStatus.asm
C206C324 00000002 #Recording/GetLCancelStatus/ResetLCancelStatus.asm
38600000 987E25FF
807E00B0 00000000
C21A4CB4 00000004 #Common/AllocBuffer.asm
38600080 3D808037
618CF1E4 7D8903A6
4E800421 906DAFC4
38000000 00000000
C20055F8 0000000F #Common/GetIsFollower.asm
7C0802A6 90010004
9421FF20 BE8100B0
@ -2039,11 +2044,6 @@ BA8100B0 800100E4
800100E4 382100E0
7C0803A6 2C1E0000
60000000 00000000
C21A4CB4 00000004 #Online/Core/EXIFileLoad/AllocBuffer.asm
38600080 3D808037
618CF1E4 7D8903A6
4E800421 906DAFC4
38000000 00000000
C20163FC 0000001B #Online/Core/EXIFileLoad/GetFileSize.asm
7C7E1B78 7C0802A6
90010004 9421FF20
@ -2193,6 +2193,63 @@ C2019608 0000000F #Online/Core/Hacks/PreventPadAlarmDuringRollback.asm
618C9618 7D8903A6
4E800420 38600000
60000000 00000000
C238E910 0000001A #Online/Core/Music/StartSong.asm
7C0802A6 90010004
9421FF54 BE81007C
7C7E1B78 3D808034
618C7364 7D8903A6
4E800421 7C7D1B78
7FC3F378 38810008
3D808033 618C7C60
7D8903A6 4E800421
2C030000 41820044
3BE10048 3BFF001F
57FF0034 386000D6
987F0000 80610038
907F0001 8061003C
907F0005 7FE3FB78
38800009 38A00001
3D808000 618C55F0
7D8903A6 4E800421
38610008 3D808033
618C7CD4 7D8903A6
4E800421 7FA3EB78
3D808034 618C738C
7D8903A6 4E800421
7FC3F378 BA81007C
800100B0 382100AC
7C0803A6 800DA998
60000000 00000000
C20236EC 0000000B #Online/Core/Music/Stop.asm
7C0802A6 90010004
9421FF9C BE810034
3BE10008 3BFF001F
57FF0034 386000D7
987F0000 7FE3FB78
38800001 38A00001
3D808000 618C55F0
7D8903A6 4E800421
BA810034 80010068
38210064 7C0803A6
38000000 00000000
C20249F0 00000011 #Online/Core/Music/VolumeChange.asm
4800000C 4E800021
00000000 900D81E8
7C0802A6 90010004
9421FF9C BE810034
4BFFFFE5 7FC802A6
808D81E8 807E0000
7C032000 4182003C
909E0000 3BE10008
3BFF001F 57FF0034
386000D8 987F0000
989F0001 7FE3FB78
38800002 38A00001
3D808000 618C55F0
7D8903A6 4E800421
BA810034 80010068
38210064 7C0803A6
60000000 00000000
C21D4578 00000003 #Online/Core/PreventFileAlarms/FreezeStadium.asm
FFE00890 3D80801D
618C4FD8 7D8903A6

@ -1 +1 @@
Subproject commit 76b7c3a54020593dc5393cfdb35baf42c55bffab
Subproject commit e100ac1fa833c5cb2ff2b770ed301fb5cb298be0

View file

@ -21,12 +21,6 @@
#include "Core/ConfigManager.h"
#include "Core/System.h"
// SlippiChange: Added as a hook for the Jukebox to call.
int AudioCommonGetCurrentVolume()
{
return Config::Get(Config::MAIN_AUDIO_MUTED) ? 0 : Config::Get(Config::MAIN_AUDIO_VOLUME);
}
namespace AudioCommon
{
constexpr int AUDIO_VOLUME_MIN = 0;

View file

@ -18,17 +18,6 @@ namespace Core
class System;
}
// SlippiChange: Added as a hook for the Jukebox to call.
//
// I've intentionally kept this outside of the C++ namespace as I am unsure of the risks
// of having this inside there with regards to how Rust receives it.
//
// If someone can prove that it's safe, then feel free to move it back into the namespace
// proper. For now, I've just prefixed the method name with the namespace name
// for grep-ability.
int AudioCommonGetCurrentVolume();
namespace AudioCommon
{
void InitSoundStream(Core::System& system);

View file

@ -41,6 +41,7 @@
#include "VideoCommon/OnScreenDisplay.h"
// The Rust library that houses a "shadow" EXI Device that we can call into.
#include "EXI_DeviceSlippi.h"
#include "SlippiRustExtensions.h"
#define FRAME_INTERVAL 900
@ -135,12 +136,6 @@ void OSDMessageHandler(const char* message, u32 color, u32 duration_ms)
OSD::AddMessage(msg, duration_ms, color);
}
// This function gets passed to Jukebox for handling music volume changes
int GetJukeboxVolume()
{
return Config::Get(Config::SLIPPI_JUKEBOX_VOLUME);
}
CEXISlippi::CEXISlippi(Core::System& system, const std::string current_file_name)
: IEXIDevice(system)
{
@ -3240,6 +3235,21 @@ void CEXISlippi::DMAWrite(u32 _uAddr, u32 _uSize)
case CMD_GET_PLAYER_SETTINGS:
handleGetPlayerSettings();
break;
case CMD_PLAY_MUSIC:
{
auto args = SlippiExiTypes::Convert<SlippiExiTypes::PlayMusicQuery>(&memPtr[bufLoc]);
slprs_jukebox_start_song(slprs_exi_device_ptr, args.offset, args.size);
break;
}
case CMD_STOP_MUSIC:
slprs_jukebox_stop_music(slprs_exi_device_ptr);
break;
case CMD_CHANGE_MUSIC_VOLUME:
{
auto args = SlippiExiTypes::Convert<SlippiExiTypes::ChangeMusicVolumeQuery>(&memPtr[bufLoc]);
slprs_jukebox_set_melee_music_volume(slprs_exi_device_ptr, args.volume);
break;
}
default:
writeToFileAsync(&memPtr[bufLoc], payloadLen + 1, "");
SlippiSpectateServer::getInstance().write(&memPtr[bufLoc], payloadLen + 1);
@ -3291,14 +3301,27 @@ void CEXISlippi::ConfigureJukebox()
}
#endif
auto& system = Core::System::GetInstance();
int dolphin_system_volume =
Config::Get(Config::MAIN_AUDIO_MUTED) ? 0 : Config::Get(Config::MAIN_AUDIO_VOLUME);
slprs_exi_device_configure_jukebox(
slprs_exi_device_ptr, Config::Get(Config::SLIPPI_ENABLE_JUKEBOX), system.GetMemory().GetRAM(),
AudioCommonGetCurrentVolume, GetJukeboxVolume);
int dolphin_music_volume = Config::Get(Config::SLIPPI_JUKEBOX_VOLUME);
slprs_exi_device_configure_jukebox(slprs_exi_device_ptr,
Config::Get(Config::SLIPPI_ENABLE_JUKEBOX),
dolphin_system_volume, dolphin_music_volume);
#endif
}
void CEXISlippi::UpdateJukeboxDolphinSystemVolume(int volume)
{
slprs_jukebox_set_dolphin_system_volume(slprs_exi_device_ptr, volume);
}
void CEXISlippi::UpdateJukeboxDolphinMusicVolume(int volume)
{
slprs_jukebox_set_dolphin_music_volume(slprs_exi_device_ptr, volume);
}
bool CEXISlippi::IsPresent() const
{
return true;

View file

@ -38,6 +38,8 @@ public:
void DMARead(u32 addr, u32 size) override;
void ConfigureJukebox();
void UpdateJukeboxDolphinSystemVolume(int volume);
void UpdateJukeboxDolphinMusicVolume(int volume);
bool IsPresent() const override;
@ -91,6 +93,9 @@ private:
CMD_GCT_LENGTH = 0xD3,
CMD_GCT_LOAD = 0xD4,
CMD_GET_DELAY = 0xD5,
CMD_PLAY_MUSIC = 0xD6,
CMD_STOP_MUSIC = 0xD7,
CMD_CHANGE_MUSIC_VOLUME = 0xD8,
CMD_PREMADE_TEXT_LENGTH = 0xE1,
CMD_PREMADE_TEXT_LOAD = 0xE2,
};
@ -149,6 +154,10 @@ private:
{CMD_GCT_LENGTH, 0x0},
{CMD_GCT_LOAD, 0x4},
{CMD_GET_DELAY, 0x0},
{CMD_PLAY_MUSIC, static_cast<u32>(sizeof(SlippiExiTypes::PlayMusicQuery) - 1)},
{CMD_STOP_MUSIC, 0x0},
{CMD_CHANGE_MUSIC_VOLUME,
static_cast<u32>(sizeof(SlippiExiTypes::ChangeMusicVolumeQuery) - 1)},
{CMD_PREMADE_TEXT_LENGTH, 0x2},
{CMD_PREMADE_TEXT_LOAD, 0x2},
};

View file

@ -89,6 +89,19 @@ struct GetPlayerSettingsResponse
PlayerSettings settings[4];
};
struct PlayMusicQuery
{
u8 command;
u32 offset;
u32 size;
};
struct ChangeMusicVolumeQuery
{
u8 command;
u8 volume;
};
// Not sure if resetting is strictly needed, might be contained to the file
#pragma pack()
@ -125,4 +138,13 @@ inline OverwriteSelectionsQuery Convert(u8* payload)
q.stage_id = Common::FromBigEndian(q.stage_id);
return q;
}
template <>
inline PlayMusicQuery Convert(u8* payload)
{
auto q = *reinterpret_cast<PlayMusicQuery*>(payload);
q.offset = Common::FromBigEndian(q.offset);
q.size = Common::FromBigEndian(q.size);
return q;
}
}; // namespace SlippiExiTypes

View file

@ -28,6 +28,11 @@
#include "DolphinQt/Config/SettingsWindow.h"
#include "DolphinQt/Settings.h"
#ifndef IS_PLAYBACK
#include "Core/HW/EXI/EXI.h"
#include "Core/HW/EXI/EXI_DeviceSlippi.h"
#endif
AudioPane::AudioPane()
{
CheckNeedForLatencyControl();
@ -406,6 +411,19 @@ void AudioPane::OnVolumeChanged(int volume)
{
m_volume_slider->setValue(volume);
m_volume_indicator->setText(tr("%1%").arg(volume));
#ifndef IS_PLAYBACK
if (Core::GetState() == Core::State::Running)
{
auto& system = Core::System::GetInstance();
auto& exi_manager = system.GetExpansionInterface();
ExpansionInterface::CEXISlippi* slippi_exi = static_cast<ExpansionInterface::CEXISlippi*>(
exi_manager.GetDevice(ExpansionInterface::Slot::B));
if (slippi_exi != nullptr)
slippi_exi->UpdateJukeboxDolphinSystemVolume(volume);
}
#endif
}
void AudioPane::CheckNeedForLatencyControl()

View file

@ -102,6 +102,8 @@ void GameCubePane::CreateWidgets()
m_slot_buttons[slot]->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
}
m_slot_combos[ExpansionInterface::Slot::B]->setDisabled(true);
for (ExpansionInterface::Slot slot : ExpansionInterface::MEMCARD_SLOTS)
{
m_memcard_path_layouts[slot] = new QHBoxLayout();

View file

@ -9,12 +9,12 @@
#include "Core/Config/MainSettings.h"
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "Core/HW/EXI/EXI.h"
#include "Core/System.h"
#include "DolphinQt/QtUtils/NonDefaultQPushButton.h"
#ifndef IS_PLAYBACK
#include "Core/HW/EXI/EXI.h"
#include "Core/HW/EXI/EXI_DeviceSlippi.h"
#include "SlippiPane.h"
#endif
@ -161,7 +161,7 @@ void SlippiPane::CreateLayout()
m_music_volume_percent->setFixedWidth(40);
sfx_music_slider_layout->addWidget(music_volume_label, 1, 0);
sfx_music_slider_layout->addWidget(m_music_volume_slider, 1, 1);
sfx_music_slider_layout->addWidget(m_music_volume_slider, 1, 1, Qt::AlignVCenter);
sfx_music_slider_layout->addWidget(m_music_volume_percent, 1, 2);
jukebox_settings_layout->addLayout(sfx_music_slider_layout);
@ -190,6 +190,7 @@ void SlippiPane::CreateLayout()
void SlippiPane::LoadConfig()
{
#ifndef IS_PLAYBACK
// Replay Settings
auto save_replays = Config::Get(Config::SLIPPI_SAVE_REPLAYS);
m_save_replays->setChecked(save_replays);
@ -219,10 +220,14 @@ void SlippiPane::LoadConfig()
m_music_volume_percent->setText(tr(" %1%").arg(jukebox_volume));
m_music_volume_slider->setDisabled(!enable_jukebox);
#else
// HOOKUP PLAYBACK STUFF
#endif
}
void SlippiPane::ConnectLayout()
{
#ifndef IS_PLAYBACK
// Replay Settings
connect(m_save_replays, &QCheckBox::toggled, this, &SlippiPane::SetSaveReplays);
connect(m_monthly_replay_folders, &QCheckBox::toggled, this,
@ -244,6 +249,9 @@ void SlippiPane::ConnectLayout()
connect(m_enable_jukebox, &QCheckBox::toggled, this, &SlippiPane::ToggleJukebox);
connect(m_music_volume_slider, qOverload<int>(&QSlider::valueChanged), this,
&SlippiPane::OnMusicVolumeUpdate);
#else
// HOOKUP PLAYBACK STUFF
#endif
}
void SlippiPane::SetSaveReplays(bool checked)
@ -293,6 +301,16 @@ void SlippiPane::OnMusicVolumeUpdate(int volume)
{
Config::SetBase(Config::SLIPPI_JUKEBOX_VOLUME, volume);
m_music_volume_percent->setText(tr(" %1%").arg(volume));
if (Core::GetState() == Core::State::Running)
{
auto& system = Core::System::GetInstance();
auto& exi_manager = system.GetExpansionInterface();
ExpansionInterface::CEXISlippi* slippi_exi = static_cast<ExpansionInterface::CEXISlippi*>(
exi_manager.GetDevice(ExpansionInterface::Slot::B));
if (slippi_exi != nullptr)
slippi_exi->UpdateJukeboxDolphinMusicVolume(volume);
}
}
void SlippiPane::OnSaveConfig()