diff --git a/stratosphere/fatal/source/fatal_task_sound.cpp b/stratosphere/fatal/source/fatal_task_sound.cpp index 9a08f331e..2588b0ade 100644 --- a/stratosphere/fatal/source/fatal_task_sound.cpp +++ b/stratosphere/fatal/source/fatal_task_sound.cpp @@ -20,39 +20,54 @@ void StopSoundTask::StopSound() { /* Talk to the ALC5639 over I2C, and disable audio output. */ - I2cSession audio; - if (R_SUCCEEDED(i2cOpenSession(&audio, I2cDevice_AudioCodec))) { - struct { - u16 dev; - u8 val; - } __attribute__((packed)) cmd; - static_assert(sizeof(cmd) == 3, "I2C command definition!"); + { + I2cSession audio; + if (R_SUCCEEDED(i2cOpenSession(&audio, I2cDevice_AudioCodec))) { + struct { + u16 dev; + u8 val; + } __attribute__((packed)) cmd; + static_assert(sizeof(cmd) == 3, "I2C command definition!"); - cmd.dev = 0xC801; - cmd.val = 200; - i2csessionSendAuto(&audio, &cmd, sizeof(cmd), I2cTransactionOption_All); - - cmd.dev = 0xC802; - cmd.val = 200; - i2csessionSendAuto(&audio, &cmd, sizeof(cmd), I2cTransactionOption_All); - - cmd.dev = 0xC802; - cmd.val = 200; - i2csessionSendAuto(&audio, &cmd, sizeof(cmd), I2cTransactionOption_All); - - for (u16 dev = 97; dev <= 102; dev++) { - cmd.dev = dev; - cmd.val = 0; + cmd.dev = 0xC801; + cmd.val = 200; i2csessionSendAuto(&audio, &cmd, sizeof(cmd), I2cTransactionOption_All); + + cmd.dev = 0xC802; + cmd.val = 200; + i2csessionSendAuto(&audio, &cmd, sizeof(cmd), I2cTransactionOption_All); + + cmd.dev = 0xC802; + cmd.val = 200; + i2csessionSendAuto(&audio, &cmd, sizeof(cmd), I2cTransactionOption_All); + + for (u16 dev = 97; dev <= 102; dev++) { + cmd.dev = dev; + cmd.val = 0; + i2csessionSendAuto(&audio, &cmd, sizeof(cmd), I2cTransactionOption_All); + } + + i2csessionClose(&audio); } - - i2csessionClose(&audio); } - /* TODO: Talk to the ALC5639 over GPIO */ + /* Talk to the ALC5639 over GPIO, and disable audio output */ + { + GpioPadSession audio; + if (R_SUCCEEDED(gpioOpenSession(&audio, GpioPadName_AudioCodec))) { + /* Set direction output, sleep 200 ms so it can take effect. */ + gpioPadSetDirection(&audio, GpioDirection_Output); + svcSleepThread(200000000UL); + + /* Pull audio codec low. */ + gpioPadSetValue(&audio, GpioValue_Low); + + gpioPadClose(&audio); + } + } } Result StopSoundTask::Run() { StopSound(); return 0; -} \ No newline at end of file +} diff --git a/stratosphere/fatal/source/fatal_task_sound.hpp b/stratosphere/fatal/source/fatal_task_sound.hpp index bbce20d4c..a6feea049 100644 --- a/stratosphere/fatal/source/fatal_task_sound.hpp +++ b/stratosphere/fatal/source/fatal_task_sound.hpp @@ -28,4 +28,4 @@ class StopSoundTask : public IFatalTask { virtual const char *GetName() const override { return "SoundTask"; } -}; \ No newline at end of file +};