Skip to content

Commit

Permalink
Fixxed mono audio streaming.
Browse files Browse the repository at this point in the history
Fixxed mono audio streaming.
  • Loading branch information
Rinnegatamante committed Mar 22, 2016
1 parent e4be725 commit 62f6437
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 36 deletions.
39 changes: 19 additions & 20 deletions src/3ds_decoder.cpp
Expand Up @@ -34,8 +34,8 @@

/*
+-----------------------------------------------------+
| |
| SOUNDS |
| |
| SOUNDS |
| |
+-----------------------------------------------------+
*/
Expand Down Expand Up @@ -192,8 +192,8 @@ int DecodeSound(std::string const& filename, DecodedSound* Sound){

/*
+-----------------------------------------------------+
| |
| MUSICS |
| |
| MUSICS |
| |
+-----------------------------------------------------+
*/
Expand Down Expand Up @@ -266,25 +266,24 @@ void UpdateWavStream(DecodedMusic* Sound){
// Mono file
if (!Sound->isStereo){
bytesRead = fread(Sound->audiobuf+(half_check*half_buf), 1, half_buf, Sound->handle);
//if (bytesRead != half_buf){
// fseek(Sound->handle, Sound->audiobuf_offs, SEEK_SET);
// fread(Sound->audiobuf+((Sound->block_idx%2)*half_buf), 1, half_buf, Sound->handle);
//}
if (bytesRead != half_buf){ // EoF
fseek(Sound->handle, Sound->audiobuf_offs, SEEK_SET);
fread(Sound->audiobuf+((Sound->block_idx%2)*half_buf), 1, half_buf, Sound->handle);
}
// Stereo file
}else{
u32 chn_size = half_buf;
u32 half_chn_size = chn_size>>1;
u8* left_channel = Sound->audiobuf;
u8* right_channel = &Sound->audiobuf[half_buf];
u32 half_chn_size = half_buf>>1;
u16 byteperchannel = Sound->bytepersample>>1;
int z = (half_buf>>1)*(half_check);
for (u32 i=0;i<half_chn_size;i=i+byteperchannel){
bytesRead = fread(&Sound->audiobuf[z], 1, byteperchannel, Sound->handle);
fread(&Sound->audiobuf[z+chn_size], 1, byteperchannel, Sound->handle);
z=z+byteperchannel;
//if (bytesRead != byteperchannel){
// fseek(Sound->handle, Sound->audiobuf_offs, SEEK_SET);
// i=i-byteperchannel;
// z=z-byteperchannel;
//}
int z = half_chn_size * half_check;
for (u32 i=0;i<half_buf;i=i+Sound->bytepersample){
bytesRead = fread(&left_channel[z], 1, byteperchannel, Sound->handle);
fread(&right_channel[z], 1, byteperchannel, Sound->handle);
if (bytesRead != byteperchannel){ // EoF
fseek(Sound->handle, Sound->audiobuf_offs, SEEK_SET);
i=i-Sound->bytepersample;
}else z=z+byteperchannel;
}
}

Expand Down
18 changes: 6 additions & 12 deletions src/audio_3ds.cpp
Expand Up @@ -34,15 +34,13 @@ volatile bool termStream = false;
DecodedMusic* BGM = NULL;
Handle updateStream;
static void streamThread(void* arg){


while(1) {
for(;;) {

// A pretty bad way to do mutual exclusion
//svcWaitSynchronization(updateStream, U64_MAX);
//svcClearEvent(updateStream);
// Looks like if we delete this, thread will crash
svcSleepThread(10000);

// ...and a pretty bad way to close thread too
// A pretty bad way to close thread
if(termStream){
termStream = false;
threadExit(0);
Expand Down Expand Up @@ -94,7 +92,6 @@ CtrAudio::~CtrAudio() {

// Closing BGM streaming thread
termStream = true;
svcSignalEvent(updateStream);
while (termStream){} // Wait for thread exiting...
if (BGM != NULL){
linearFree(BGM->audiobuf);
Expand Down Expand Up @@ -143,10 +140,9 @@ void CtrAudio::BGM_Play(std::string const& file, int volume, int /* pitch */, in
if (BGM->isStereo){
u32 chnbuf_size = BGM->audiobuf_size>>1;
csndPlaySound(0x1E, SOUND_LINEAR_INTERP | codec | SOUND_REPEAT, samplerate, vol, -1.0, (u32*)BGM->audiobuf, (u32*)BGM->audiobuf, chnbuf_size); // Left
csndPlaySound(0x1F, SOUND_LINEAR_INTERP | codec | SOUND_REPEAT, samplerate, vol, 1.0, (u32*)(BGM->audiobuf + chnbuf_size), ((u32*)BGM->audiobuf + chnbuf_size), chnbuf_size); // Right
csndPlaySound(0x1F, SOUND_LINEAR_INTERP | codec | SOUND_REPEAT, samplerate, vol, 1.0, (u32*)(BGM->audiobuf + chnbuf_size), (u32*)(BGM->audiobuf + chnbuf_size), chnbuf_size); // Right
}else csndPlaySound(0x1F, SOUND_LINEAR_INTERP | codec | SOUND_REPEAT, samplerate, vol, 0.0, (u32*)BGM->audiobuf, (u32*)BGM->audiobuf, BGM->audiobuf_size);
BGM->starttick = osGetTime();
svcSignalEvent(updateStream);

}

Expand Down Expand Up @@ -313,7 +309,7 @@ void CtrAudio::SE_Play(std::string const& file, int volume, int /* pitch */) {
#endif
int chnbuf_size = audiobuf_size>>1;
csndPlaySound(i+0x08, SOUND_LINEAR_INTERP | codec, samplerate, vol, -1.0, (u32*)audiobuffers[i], (u32*)audiobuffers[i], chnbuf_size); // Left
csndPlaySound(z+0x08, SOUND_LINEAR_INTERP | codec, samplerate, vol, 1.0, (u32*)(audiobuffers[i] + chnbuf_size), ((u32*)audiobuffers[i] + chnbuf_size), chnbuf_size); // Right
csndPlaySound(z+0x08, SOUND_LINEAR_INTERP | codec, samplerate, vol, 1.0, (u32*)(audiobuffers[i] + chnbuf_size), (u32*)(audiobuffers[i] + chnbuf_size), chnbuf_size); // Right

}else csndPlaySound(i+0x08, SOUND_LINEAR_INTERP | codec, samplerate, vol, 0.0, (u32*)audiobuffers[i], (u32*)audiobuffers[i], audiobuf_size);

Expand All @@ -332,8 +328,6 @@ void CtrAudio::SE_Stop() {

void CtrAudio::Update() {

if (BGM != NULL) svcSignalEvent(updateStream);

// Closing and freeing finished sounds
for(int i=0;i<num_channels;i++){
if (audiobuffers[i] != NULL){
Expand Down
7 changes: 3 additions & 4 deletions src/main.cpp
Expand Up @@ -45,8 +45,10 @@ extern "C" int main(int argc, char* argv[]) {
Output::Debug("Debug console started...\n");
#endif

// Performing svchax to gain csnd:SND access
#ifdef SUPPORT_AUDIO
aptOpenSession();
APT_SetAppCpuTimeLimit(30);
aptCloseSession();

// Check if we already have access to csnd:SND, if not, we will perform a kernel privilege escalation
Handle csndHandle = 0;
Expand All @@ -60,9 +62,6 @@ extern "C" int main(int argc, char* argv[]) {
#endif

hidInit();
aptOpenSession();
APT_SetAppCpuTimeLimit(30);
aptCloseSession();

// Enable 804 Mhz mode if on N3DS
APT_CheckNew3DS(&isN3DS);
Expand Down

0 comments on commit 62f6437

Please sign in to comment.