void Sound::stop() { if (getStatus() == Stopped) return; m_pauseOffset = Time::Zero; ndspChnWaveBufClear(m_channel); m_ndspWaveBuf.status = NDSP_WBUF_DONE; }
void Sound::pause() { if (getStatus() != Playing) return; m_pauseOffset = getPlayingOffset(); ndspChnWaveBufClear(m_channel); }
static int audioStop(lua_State *L) { // love.audio.stop() if (!soundEnabled) luaU_error(L, "Could not initialize audio"); for (int i = 0; i <= 23; i++) { ndspChnWaveBufClear(i); } return 0; }
void closeMusic(Music* src){ closeStream = true; svcSignalEvent(updateStream); while (closeStream){} // Wait for thread exiting... svcCloseHandle(updateStream); // Purging everything purgeTable(src->blocks); ndspChnReset(src->ch); ndspChnWaveBufClear(src->ch); linearFree(src->audiobuf); if (src->audiobuf2 != NULL) linearFree(src->audiobuf2); free(src); }
// startMusic: Plays a song with network streaming feature void startMusic(Socket* sock, Music* src) { closeStream = false; src->streamLoop = false; // TODO: Add looping feature songPointer = 0; netSize = 0; u32 ch = 0x08; u32 ch2 = 0x09; bool non_native_encode = false; ThreadFunc streamFunction = streamWAV; u8 tmp_encode; /*if (src->encoding == CSND_ENCODING_VORBIS){ streamFunction = streamOGG; tmp_encode = src->encoding; src->encoding = CSND_ENCODING_PCM16; non_native_encode = true; }*/ int raw_format; if (src->audiotype == 1) raw_format = NDSP_FORMAT_MONO_PCM16; else raw_format = NDSP_FORMAT_STEREO_PCM16; ndspChnReset(ch); ndspChnWaveBufClear(ch); ndspChnSetInterp(ch, NDSP_INTERP_LINEAR); ndspChnSetRate(ch, float(src->samplerate)); ndspChnSetFormat(ch, raw_format); ndspWaveBuf* waveBuf = (ndspWaveBuf*)calloc(1, sizeof(ndspWaveBuf)); createDspBlock(waveBuf, src->bytepersample, src->mem_size, 0, (u32*)src->audiobuf); src->blocks = NULL; populatePurgeTable(src, waveBuf); ndspChnWaveBufAdd(ch, waveBuf); src->tick = osGetTime(); src->wavebuf = waveBuf; src->ch = ch; src->isPlaying = true; src->lastCheck = ndspChnGetSamplePos(ch); src->streamLoop = false; svcCreateEvent(&updateStream,0); cachePackage* pkg = (cachePackage*)malloc(sizeof(cachePackage)); pkg->client = sock; pkg->song = src; svcSignalEvent(updateStream); threadCreate(streamFunction, pkg, 8192, 0x18, 0, true); src->isPlaying = true; }
void streamMusic(void* arg) { clearBottomScreen(); debug("play_buffer start\n"); stream_filename* strm_file = static_cast<stream_filename*>(arg); VGMSTREAM* vgmstream = strm_file->stream; if (!vgmstream) return; int channel = 0; ndspSetOutputMode(NDSP_OUTPUT_STEREO); for (int i = 0; i < vgmstream->channels; i++) { ndspChnReset(channel + i); ndspChnSetInterp(channel + i, NDSP_INTERP_LINEAR); ndspChnSetRate(channel + i, vgmstream->sample_rate / vgmstream->channels); ndspChnSetFormat(channel + i, NDSP_FORMAT_STEREO_PCM16); } std::vector<ndspWaveBuf> waveBufs1(vgmstream->channels); std::vector<ndspWaveBuf> waveBufs2(vgmstream->channels); for (auto& waveBuf : waveBufs1) memset(&waveBuf, 0, sizeof(ndspWaveBuf)); for (auto& waveBuf : waveBufs2) memset(&waveBuf, 0, sizeof(ndspWaveBuf)); debug("play_buffer signal produce\n"); svcSignalEvent(bufferReadyProduceRequest); // Wait for 2 buffers to play debug("play_buffer wait data 1\n"); svcWaitSynchronization(bufferReadyConsumeRequest, U64_MAX); svcClearEvent(bufferReadyConsumeRequest); debug("play_buffer signal produce\n"); svcSignalEvent(bufferReadyProduceRequest); debug("play_buffer wait data 2\n"); svcWaitSynchronization(bufferReadyConsumeRequest, U64_MAX); svcClearEvent(bufferReadyConsumeRequest); // Play it debug("play_buffer play\n"); playSoundChannels(channel, playBuffer1.samples, false, playBuffer1.channels, waveBufs1); playSoundChannels(channel, playBuffer2.samples, false, playBuffer2.channels, waveBufs2); stream_buffer* buffer = &playBuffer2; stream_buffer* playingBuf = &playBuffer1; std::vector<ndspWaveBuf>* waveBuf = &waveBufs2; std::vector<ndspWaveBuf>* playingWaveBuf = &waveBufs1; debug("play_buffer signal produce\n"); svcSignalEvent(bufferReadyProduceRequest); while (runThreads) { if (playingWaveBuf->at(0).status == NDSP_WBUF_DONE) { debug("play_buffer wait data\n"); // Wait for sound data here svcWaitSynchronization(bufferReadyConsumeRequest, U64_MAX); svcClearEvent(bufferReadyConsumeRequest); // Flip buffers if (buffer == &playBuffer1) { buffer = &playBuffer2; playingBuf = &playBuffer1; waveBuf = &waveBufs2; playingWaveBuf = &waveBufs1; } else { buffer = &playBuffer1; playingBuf = &playBuffer2; waveBuf = &waveBufs1; playingWaveBuf = &waveBufs2; } debug("play_buffer play\n"); playSoundChannels(channel, buffer->samples, false, buffer->channels, *waveBuf); debug("play_buffer signal produce\n"); svcSignalEvent(bufferReadyProduceRequest); } } for (int i = 0; i < vgmstream->channels; i++) { ndspChnWaveBufClear(channel + i); } debug("play_buffer done\n"); }