Document Waveform playback functions

This commit is contained in:
Fexty12573 2025-03-28 13:38:59 +01:00
parent ffef7b02f3
commit 02cbf032db
7 changed files with 165 additions and 177 deletions

View File

@ -62,7 +62,8 @@ enum SoundSystemParam {
SOUND_SYSTEM_PARAM_FIELD_BGM_PAUSED,
SOUND_SYSTEM_PARAM_BGM_PAUSED,
SOUND_SYSTEM_PARAM_WAVE_OUT_PRIMARY_ALLOCATED = 16,
SOUND_SYSTEM_PARAM_WAVE_OUT_REVERSED_PLAYBACK = 15,
SOUND_SYSTEM_PARAM_WAVE_OUT_PRIMARY_ALLOCATED,
SOUND_SYSTEM_PARAM_WAVE_OUT_SECONDARY_ALLOCATED,
SOUND_SYSTEM_PARAM_FIELD_BGM_BANK_STATE = 19,
@ -77,6 +78,8 @@ enum SoundSystemParam {
SOUND_SYSTEM_PARAM_FIELD_BGM = 32,
SOUND_SYSTEM_PARAM_WAVE_OUT_REVERSE_BUFFER = 34,
SOUND_SYSTEM_PARAM_CHATOT_CRY = 36,
SOUND_SYSTEM_PARAM_ALLOW_2_POKEMON_CRIES = 53,
@ -102,7 +105,7 @@ typedef struct SoundSystem {
u8 fieldBGMPaused;
u8 bgmPaused;
u16 unk_BCD5E;
u8 unk_BCD60;
u8 waveOutReversedPlayback;
u8 waveOutPrimaryAllocated;
u8 waveOutSecondaryAllocated;
u8 unk_BCD63;
@ -115,7 +118,7 @@ typedef struct SoundSystem {
u8 unk_BCD85;
u16 currentFieldBGM;
const SNDWaveData *unk_BCD88;
void *unk_BCD8C;
void *waveOutReverseBuffer;
int unk_BCD90;
SysTask *unk_BCD94;
ChatotCry *chatotCry;

View File

@ -1,19 +0,0 @@
#ifndef POKEPLATINUM_STRUCT_02004CB4_H
#define POKEPLATINUM_STRUCT_02004CB4_H
#include <nnsys.h>
typedef struct {
NNSSndWaveOutHandle *unk_00;
NNSSndWaveFormat unk_04;
const void *unk_08;
BOOL unk_0C;
int unk_10;
int unk_14;
int unk_18;
int unk_1C;
int unk_20;
int unk_24;
} UnkStruct_02004CB4;
#endif // POKEPLATINUM_STRUCT_02004CB4_H

View File

@ -6,7 +6,6 @@
#include <nnsys.h>
#include "sound_system.h"
#include "struct_defs/struct_02004CB4.h"
#define FIELD_BGM_BANK_STATE_IDLE 0
@ -15,6 +14,11 @@
#define MIN_BGM_VOLUME 0
#define MAX_BGM_VOLUME 127
#define WAVE_OUT_SPEED(SPEED) (int)((SPEED) * 32768)
#define WAVE_OUT_PAN_LEFT 0
#define WAVE_OUT_PAN_CENTER 64
#define WAVE_OUT_PAN_RIGHT 127
enum SoundScene {
SOUND_SCENE_NONE = 0,
@ -33,6 +37,19 @@ enum WaveOutChannel {
WAVE_OUT_CHANNEL_SECONDARY = 15,
};
typedef struct WaveOutParam {
NNSSndWaveOutHandle *handle;
NNSSndWaveFormat format;
const void *data;
BOOL loop;
int loopStartSample;
int samples;
int sampleRate;
int volume;
int speed;
int pan;
} WaveOutParam;
void Sound_SetBGMFixed(u8 fixed);
u8 Sound_IsBGMFixed(void);
void Sound_SetCurrentBGM(u16 bgmID);
@ -67,14 +84,14 @@ MICResult Sound_StartMicManualSampling(MICSamplingType param0, void *param1, MIC
NNSSndWaveOutHandle *Sound_GetWaveOutHandle(enum WaveOutChannel channel);
BOOL Sound_AllocateWaveOutChannel(enum WaveOutChannel param0);
void Sound_FreeWaveOutChannel(enum WaveOutChannel param0);
BOOL sub_02004CB4(UnkStruct_02004CB4 *param0, u32 param1);
void sub_02004CF4(u32 param0);
BOOL sub_02004D04(u32 param0);
void sub_02004D14(u32 param0, u8 param1);
void sub_02004D2C(u32 param0, u32 param1);
void sub_02004D40(u32 param0, int param1);
BOOL sub_02004D78(u16 param0, int param1, int param2, u32 param3, int heapID);
void sub_02004E84(u32 param0);
BOOL Sound_PlayWaveOut(WaveOutParam *param0, enum WaveOutChannel param1);
void Sound_StopWaveOut(enum WaveOutChannel param0);
BOOL Sound_IsWaveOutPlaying(enum WaveOutChannel param0);
void Sound_SetWaveOutPan(enum WaveOutChannel param0, u8 param1);
void Sound_SetWaveOutSpeed(enum WaveOutChannel param0, u32 param1);
void Sound_SetWaveOutVolume(enum WaveOutChannel param0, int param1);
BOOL Sound_PlayWaveOutReversed(u16 param0, int param1, int param2, enum WaveOutChannel param3, int heapID);
void Sound_StopWaveOutReversed(enum WaveOutChannel param0);
BOOL sub_02004EC0(void);
BOOL sub_02004EC8(int param0);
void sub_02004EEC(int param0);

View File

@ -187,8 +187,8 @@ void *SoundSystem_GetParam(enum SoundSystemParam param)
return &soundSys->bgmPaused;
case 14:
return &soundSys->unk_BCD5E;
case 15:
return &soundSys->unk_BCD60;
case SOUND_SYSTEM_PARAM_WAVE_OUT_REVERSED_PLAYBACK:
return &soundSys->waveOutReversedPlayback;
case SOUND_SYSTEM_PARAM_WAVE_OUT_PRIMARY_ALLOCATED:
return &soundSys->waveOutPrimaryAllocated;
case SOUND_SYSTEM_PARAM_WAVE_OUT_SECONDARY_ALLOCATED:
@ -225,8 +225,8 @@ void *SoundSystem_GetParam(enum SoundSystemParam param)
return &soundSys->currentFieldBGM;
case 33:
return &soundSys->unk_BCD88;
case 34:
return &soundSys->unk_BCD8C;
case SOUND_SYSTEM_PARAM_WAVE_OUT_REVERSE_BUFFER:
return &soundSys->waveOutReverseBuffer;
case 35:
return &soundSys->unk_BCD94;
case SOUND_SYSTEM_PARAM_CHATOT_CRY:

View File

@ -3,7 +3,6 @@
#include <nitro.h>
#include <string.h>
#include "struct_defs/struct_02004CB4.h"
#include "struct_defs/struct_020052C8.h"
#include "communication_system.h"
@ -28,14 +27,14 @@ void sub_02004AD4(u16 param0, int param1);
NNSSndWaveOutHandle *Sound_GetWaveOutHandle(enum WaveOutChannel channel);
BOOL Sound_AllocateWaveOutChannel(enum WaveOutChannel param0);
void Sound_FreeWaveOutChannel(enum WaveOutChannel param0);
void sub_02004D14(u32 param0, u8 param1);
void sub_02004D2C(u32 param0, u32 param1);
void sub_02004D40(u32 param0, int param1);
BOOL sub_02004CB4(UnkStruct_02004CB4 *param0, u32 param1);
void sub_02004CF4(u32 param0);
BOOL sub_02004D04(u32 param0);
void sub_02004E84(u32 param0);
static void sub_02004E64(u8 *param0, u32 param1);
void Sound_SetWaveOutPan(enum WaveOutChannel param0, u8 param1);
void Sound_SetWaveOutSpeed(enum WaveOutChannel param0, u32 param1);
void Sound_SetWaveOutVolume(enum WaveOutChannel param0, int param1);
BOOL Sound_PlayWaveOut(WaveOutParam *param0, enum WaveOutChannel param1);
void Sound_StopWaveOut(enum WaveOutChannel param0);
BOOL Sound_IsWaveOutPlaying(enum WaveOutChannel param0);
void Sound_StopWaveOutReversed(enum WaveOutChannel param0);
static void Sound_Impl_ReverseBuffer(u8 *param0, u32 param1);
BOOL sub_02004EC0(void);
BOOL sub_02004EC8(int param0);
void sub_02004EEC(int param0);
@ -834,163 +833,149 @@ void Sound_FreeWaveOutChannel(enum WaveOutChannel channel)
}
}
BOOL sub_02004CB4(UnkStruct_02004CB4 *param0, u32 param1)
BOOL Sound_PlayWaveOut(WaveOutParam *param, enum WaveOutChannel channel)
{
int v0 = NNS_SndWaveOutStart(*param0->unk_00, param0->unk_04, param0->unk_08, param0->unk_0C, param0->unk_10, param0->unk_14, param0->unk_18, param0->unk_1C, param0->unk_20, param0->unk_24);
BOOL success = NNS_SndWaveOutStart(
*param->handle,
param->format,
param->data,
param->loop,
param->loopStartSample,
param->samples,
param->sampleRate,
param->volume,
param->speed,
param->pan
);
if (v0 == 0) {
Sound_FreeWaveOutChannel(param1);
if (success == FALSE) {
Sound_FreeWaveOutChannel(channel);
}
return v0;
return success;
}
void sub_02004CF4(u32 param0)
void Sound_StopWaveOut(enum WaveOutChannel channel)
{
NNS_SndWaveOutStop(*Sound_GetWaveOutHandle(param0));
return;
NNS_SndWaveOutStop(*Sound_GetWaveOutHandle(channel));
}
BOOL sub_02004D04(u32 param0)
BOOL Sound_IsWaveOutPlaying(enum WaveOutChannel channel)
{
return NNS_SndWaveOutIsPlaying(*Sound_GetWaveOutHandle(param0));
return NNS_SndWaveOutIsPlaying(*Sound_GetWaveOutHandle(channel));
}
void sub_02004D14(u32 param0, u8 param1)
void Sound_SetWaveOutPan(enum WaveOutChannel channel, u8 pan)
{
u8 v0;
if (param1 > 127) {
v0 = 127;
u8 clampedPan;
if (pan > 127) {
clampedPan = 127;
} else {
v0 = param1;
clampedPan = pan;
}
NNS_SndWaveOutSetPan(*Sound_GetWaveOutHandle(param0), v0);
return;
NNS_SndWaveOutSetPan(*Sound_GetWaveOutHandle(channel), clampedPan);
}
void sub_02004D2C(u32 param0, u32 param1)
void Sound_SetWaveOutSpeed(enum WaveOutChannel channel, u32 speed)
{
NNS_SndWaveOutSetSpeed(*Sound_GetWaveOutHandle(param0), param1);
return;
NNS_SndWaveOutSetSpeed(*Sound_GetWaveOutHandle(channel), speed);
}
void sub_02004D40(u32 param0, int param1)
void Sound_SetWaveOutVolume(enum WaveOutChannel channel, int volume)
{
if (sub_02036314() == 1) {
NNS_SndWaveOutSetVolume(*Sound_GetWaveOutHandle(param0), (param1 / 5));
NNS_SndWaveOutSetVolume(*Sound_GetWaveOutHandle(channel), volume / 5);
} else {
NNS_SndWaveOutSetVolume(*Sound_GetWaveOutHandle(param0), param1);
NNS_SndWaveOutSetVolume(*Sound_GetWaveOutHandle(channel), volume);
}
return;
}
BOOL sub_02004D78(u16 param0, int param1, int param2, u32 param3, int heapID)
BOOL Sound_PlayWaveOutReversed(u16 waveArcID, int volume, int pan, enum WaveOutChannel channel, int heapID)
{
u8 *v0;
const NNSSndArcWaveArcInfo *v1;
u32 v2;
int v3, v4;
SoundSystem *v5 = SoundSystem_Get();
void **v6 = SoundSystem_GetParam(34);
(void)SoundSystem_Get();
void **reverseBuffer = SoundSystem_GetParam(SOUND_SYSTEM_PARAM_WAVE_OUT_REVERSE_BUFFER);
if ((param3 != 14) && (param3 != 15)) {
if (channel != WAVE_OUT_CHANNEL_PRIMARY && channel != WAVE_OUT_CHANNEL_SECONDARY) {
GF_ASSERT(FALSE);
}
v1 = NNS_SndArcGetWaveArcInfo(param0);
if (v1 == NULL) {
const NNSSndArcWaveArcInfo *info = NNS_SndArcGetWaveArcInfo(waveArcID);
if (info == NULL) {
GF_ASSERT(FALSE);
return 0;
return FALSE;
}
v2 = NNS_SndArcGetFileSize(v1->fileId);
if (v2 == 0) {
u32 fileSize = NNS_SndArcGetFileSize(info->fileId);
if (fileSize == 0) {
GF_ASSERT(FALSE);
return 0;
return FALSE;
}
if (param3 == 14) {
*v6 = Heap_AllocFromHeap(heapID, v2);
if (*v6 == NULL) {
if (channel == WAVE_OUT_CHANNEL_PRIMARY) {
*reverseBuffer = Heap_AllocFromHeap(heapID, fileSize);
if (*reverseBuffer == NULL) {
GF_ASSERT(FALSE);
return 0;
return FALSE;
}
memset(*v6, 0, v2);
memset(*reverseBuffer, 0, fileSize);
v3 = NNS_SndArcReadFile(v1->fileId, *v6, v2, 0);
if (v3 == -1) {
if (NNS_SndArcReadFile(info->fileId, *reverseBuffer, fileSize, 0) == -1) {
GF_ASSERT(FALSE);
return 0;
return FALSE;
}
sub_02004E64(*v6, v2);
Sound_Impl_ReverseBuffer(*reverseBuffer, fileSize);
}
{
UnkStruct_02004CB4 v7;
WaveOutParam param;
param.handle = Sound_GetWaveOutHandle(channel);
param.format = NNS_SND_WAVE_FORMAT_PCM8;
param.data = *reverseBuffer;
param.loop = FALSE;
param.loopStartSample = 0;
param.samples = fileSize;
param.sampleRate = 13379;
param.volume = volume;
param.speed = WAVE_OUT_SPEED(0.75);
param.pan = pan;
v7.unk_00 = Sound_GetWaveOutHandle(param3);
v7.unk_04 = NNS_SND_WAVE_FORMAT_PCM8;
v7.unk_08 = *v6;
v7.unk_0C = 0;
v7.unk_10 = 0;
v7.unk_14 = v2;
v7.unk_18 = 13379;
v7.unk_1C = param1;
v7.unk_20 = 24576;
v7.unk_24 = param2;
BOOL result = Sound_PlayWaveOut(&param, channel);
v4 = sub_02004CB4(&v7, param3);
Sound_SetWaveOutVolume(channel, volume);
sub_02004D40(param3, param1);
}
u8 *reversedPlayback = SoundSystem_GetParam(SOUND_SYSTEM_PARAM_WAVE_OUT_REVERSED_PLAYBACK);
*reversedPlayback = TRUE;
v0 = SoundSystem_GetParam(15);
*v0 = 1;
return v4;
return result;
}
static void sub_02004E64(u8 *param0, u32 param1)
static void Sound_Impl_ReverseBuffer(u8 *buffer, u32 size)
{
int v0;
u8 v1;
for (v0 = 0; v0 < (param1 / 2); v0++) {
v1 = param0[v0];
param0[v0] = param0[param1 - 1 - v0];
param0[param1 - 1 - v0] = v1;
for (int i = 0; i < (size / 2); i++) {
u8 tmp = buffer[i];
buffer[i] = buffer[size - 1 - i];
buffer[size - 1 - i] = tmp;
}
return;
}
void sub_02004E84(u32 param0)
void Sound_StopWaveOutReversed(enum WaveOutChannel channel)
{
SoundSystem *v0 = SoundSystem_Get();
u8 *v1 = SoundSystem_GetParam(15);
void **v2 = SoundSystem_GetParam(34);
(void)SoundSystem_Get();
u8 *reversedPlaybackEnabled = SoundSystem_GetParam(SOUND_SYSTEM_PARAM_WAVE_OUT_REVERSED_PLAYBACK);
void **reverseBuffer = SoundSystem_GetParam(SOUND_SYSTEM_PARAM_WAVE_OUT_REVERSE_BUFFER);
if ((param0 != 14) && (param0 != 15)) {
if (channel != WAVE_OUT_CHANNEL_PRIMARY && channel != WAVE_OUT_CHANNEL_SECONDARY) {
GF_ASSERT(FALSE);
}
sub_02004CF4(param0);
Sound_StopWaveOut(channel);
if (*v1 == 1) {
*v1 = 0;
Heap_FreeToHeap(*v2);
if (*reversedPlaybackEnabled == TRUE) {
*reversedPlaybackEnabled = FALSE;
Heap_FreeToHeap(*reverseBuffer);
}
return;
}
BOOL sub_02004EC0(void)

View File

@ -15,6 +15,9 @@
#include "unk_020041CC.h"
#include "unk_02006224.h"
#define WAVE_OUT_SPEED_HYPERVOICE_1 (WAVE_OUT_SPEED(1.046875))
#define WAVE_OUT_SPEED_UPROAR_1 (WAVE_OUT_SPEED(0.8125))
typedef struct {
int unk_00;
SysTask *unk_04;
@ -216,11 +219,11 @@ void Sound_StopAll(void)
NNS_SndPlayerStopSeqAll(0);
if (*v0 == 1) {
sub_02004CF4(14);
Sound_StopWaveOut(WAVE_OUT_CHANNEL_PRIMARY);
}
if (*v1 == 1) {
sub_02004CF4(15);
Sound_StopWaveOut(WAVE_OUT_CHANNEL_SECONDARY);
}
SoundSystem_SetState(SOUND_SYSTEM_STATE_IDLE);
@ -242,11 +245,11 @@ void sub_020056D4(void)
sub_0200592C(0);
if (*v1 == 1) {
sub_02004CF4(14);
Sound_StopWaveOut(WAVE_OUT_CHANNEL_PRIMARY);
}
if (*v2 == 1) {
sub_02004CF4(15);
Sound_StopWaveOut(WAVE_OUT_CHANNEL_SECONDARY);
}
return;
@ -390,12 +393,12 @@ void sub_0200592C(int param0)
NNS_SndPlayerStopSeq(SoundSystem_GetSoundHandle(8), param0);
if (*v0 == 1) {
sub_02004E84(14);
Sound_StopWaveOutReversed(WAVE_OUT_CHANNEL_PRIMARY);
Sound_FreeWaveOutChannel(WAVE_OUT_CHANNEL_PRIMARY);
}
if (*v1 == 1) {
sub_02004E84(15);
Sound_StopWaveOutReversed(WAVE_OUT_CHANNEL_SECONDARY);
Sound_FreeWaveOutChannel(WAVE_OUT_CHANNEL_SECONDARY);
}
@ -413,11 +416,11 @@ int sub_0200598C(void)
u8 *v3 = SoundSystem_GetParam(46);
if (*v0 == 1) {
return sub_02004D04(14);
return Sound_IsWaveOutPlaying(WAVE_OUT_CHANNEL_PRIMARY);
}
if (*v1 == 1) {
return sub_02004D04(15);
return Sound_IsWaveOutPlaying(WAVE_OUT_CHANNEL_SECONDARY);
}
return Sound_GetNumberOfPlayingSequencesForPlayer(0);
@ -450,9 +453,9 @@ BOOL Sound_PlayPokemonCryEx(enum PokemonCryMod cryMod, u16 species, int param2,
}
if (param2 < 0) {
v0 = 64 + (param2 / 2);
v0 = WAVE_OUT_PAN_CENTER + (param2 / 2);
} else {
v0 = 64 + (param2 / 2);
v0 = WAVE_OUT_PAN_CENTER + (param2 / 2);
}
v1 = volume - 30;
@ -465,12 +468,12 @@ BOOL Sound_PlayPokemonCryEx(enum PokemonCryMod cryMod, u16 species, int param2,
*v10 = 0;
if (*v8 == 1) {
sub_02004E84(14);
Sound_StopWaveOutReversed(WAVE_OUT_CHANNEL_PRIMARY);
Sound_FreeWaveOutChannel(WAVE_OUT_CHANNEL_PRIMARY);
}
if (*v9 == 1) {
sub_02004E84(15);
Sound_StopWaveOutReversed(WAVE_OUT_CHANNEL_SECONDARY);
Sound_FreeWaveOutChannel(WAVE_OUT_CHANNEL_SECONDARY);
}
@ -489,8 +492,8 @@ BOOL Sound_PlayPokemonCryEx(enum PokemonCryMod cryMod, u16 species, int param2,
sub_02005E4C(species, 1, volume);
} else {
if (*v8 == 1) {
sub_02004D14(14, v0);
sub_02004D40(14, volume);
Sound_SetWaveOutPan(WAVE_OUT_CHANNEL_PRIMARY, v0);
Sound_SetWaveOutVolume(WAVE_OUT_CHANNEL_PRIMARY, volume);
} else {
sub_02004F94(1, 0xffff, param2);
sub_02005E4C(species, 1, volume);
@ -537,12 +540,12 @@ BOOL Sound_PlayPokemonCryEx(enum PokemonCryMod cryMod, u16 species, int param2,
break;
case POKECRY_HYPERVOICE_1:
v5 = Sound_AllocateWaveOutChannel(WAVE_OUT_CHANNEL_PRIMARY);
v5 = sub_02004D78(species, volume, v0, 14, heapID);
sub_02004D14(14, v0);
v5 = Sound_PlayWaveOutReversed(species, volume, v0, WAVE_OUT_CHANNEL_PRIMARY, heapID);
Sound_SetWaveOutPan(WAVE_OUT_CHANNEL_PRIMARY, v0);
sub_02005E64(15, heapID);
sub_02004D2C(14, (32768 + 1536));
Sound_SetWaveOutSpeed(WAVE_OUT_CHANNEL_PRIMARY, WAVE_OUT_SPEED_HYPERVOICE_1);
v7 = sub_02006120(species, -64, v1, v0, heapID);
sub_02004D2C(15, (32768 + 1536));
Sound_SetWaveOutSpeed(WAVE_OUT_CHANNEL_SECONDARY, WAVE_OUT_SPEED_HYPERVOICE_1);
break;
case POKECRY_FAINT:
v4 = Sound_PlayPokemonCry(species, form);
@ -575,10 +578,10 @@ BOOL Sound_PlayPokemonCryEx(enum PokemonCryMod cryMod, u16 species, int param2,
break;
case POKECRY_UPROAR_1:
v5 = Sound_AllocateWaveOutChannel(WAVE_OUT_CHANNEL_PRIMARY);
v5 = sub_02004D78(species, volume, v0, 14, heapID);
sub_02004D14(14, v0);
v5 = Sound_PlayWaveOutReversed(species, volume, v0, WAVE_OUT_CHANNEL_PRIMARY, heapID);
Sound_SetWaveOutPan(WAVE_OUT_CHANNEL_PRIMARY, v0);
sub_02005E64(13, heapID);
sub_02004D2C(14, (32768 - 6144));
Sound_SetWaveOutSpeed(WAVE_OUT_CHANNEL_PRIMARY, WAVE_OUT_SPEED_UPROAR_1);
break;
case POKECRY_UPROAR_2:
v4 = Sound_PlayPokemonCry(species, form);
@ -671,12 +674,12 @@ static void sub_02005EB0(SysTask *param0, void *param1)
sub_0200592C(0);
if (*v0 == 1) {
sub_02004E84(14);
Sound_StopWaveOutReversed(WAVE_OUT_CHANNEL_PRIMARY);
Sound_FreeWaveOutChannel(WAVE_OUT_CHANNEL_PRIMARY);
}
if (*v1 == 1) {
sub_02004E84(15);
Sound_StopWaveOutReversed(WAVE_OUT_CHANNEL_SECONDARY);
Sound_FreeWaveOutChannel(WAVE_OUT_CHANNEL_SECONDARY);
}
@ -824,7 +827,7 @@ static BOOL sub_02006120(u16 param0, s8 param1, int param2, int param3, int heap
*v1 = 1;
v0 = Sound_AllocateWaveOutChannel(WAVE_OUT_CHANNEL_SECONDARY);
v0 = sub_02004D78(param0, param2, param3, 15, heapID);
v0 = Sound_PlayWaveOutReversed(param0, param2, param3, WAVE_OUT_CHANNEL_SECONDARY, heapID);
return v0;
}

View File

@ -6,7 +6,6 @@
#include "constants/species.h"
#include "struct_defs/chatot_cry.h"
#include "struct_defs/struct_02004CB4.h"
#include "math.h"
#include "sound_system.h"
@ -29,7 +28,7 @@ BOOL CheckMicRecordingStatus(void)
if (*v1 == 1) {
if (*v0 == 1) {
if (sub_02004D04(14) == 0) {
if (Sound_IsWaveOutPlaying(WAVE_OUT_CHANNEL_PRIMARY) == 0) {
ResetMicStatusFlags();
return 1;
}
@ -87,21 +86,21 @@ BOOL ProcessAudioInput(const ChatotCry *cry, u32 param1, int volume, int pan)
ProcessChatotCryAudioData(v3, GetChatotCryAudioBuffer(cry));
{
UnkStruct_02004CB4 v5;
WaveOutParam v5;
v5.unk_00 = Sound_GetWaveOutHandle(WAVE_OUT_CHANNEL_PRIMARY);
v5.unk_04 = NNS_SND_WAVE_FORMAT_PCM8;
v5.unk_08 = sub_02005014();
v5.unk_0C = 0;
v5.unk_10 = 0;
v5.unk_14 = (2000 * 1);
v5.unk_18 = 2000;
v5.unk_1C = volume;
v5.unk_20 = (32768 + v0);
v5.unk_24 = v2;
v5.handle = Sound_GetWaveOutHandle(WAVE_OUT_CHANNEL_PRIMARY);
v5.format = NNS_SND_WAVE_FORMAT_PCM8;
v5.data = sub_02005014();
v5.loop = FALSE;
v5.loopStartSample = 0;
v5.samples = (2000 * 1);
v5.sampleRate = 2000;
v5.volume = volume;
v5.speed = WAVE_OUT_SPEED(1.0) + v0;
v5.pan = v2;
v1 = sub_02004CB4(&v5, 14);
sub_02004D40(14, volume);
v1 = Sound_PlayWaveOut(&v5, WAVE_OUT_CHANNEL_PRIMARY);
Sound_SetWaveOutVolume(WAVE_OUT_CHANNEL_PRIMARY, volume);
}
*v4 = 1;
@ -116,7 +115,7 @@ void ResetMicStatusFlags(void)
u8 *v1 = SoundSystem_GetParam(30);
if (*v0 == 1) {
sub_02004E84(14);
Sound_StopWaveOutReversed(WAVE_OUT_CHANNEL_PRIMARY);
Sound_FreeWaveOutChannel(WAVE_OUT_CHANNEL_PRIMARY);
}