Example #1
0
void Sound::stop()
{
	if (getStatus() == Stopped)
		return;
	m_pauseOffset = Time::Zero;
	ndspChnWaveBufClear(m_channel);
	m_ndspWaveBuf.status = NDSP_WBUF_DONE;
}
Example #2
0
void Sound::pause()
{
	if (getStatus() != Playing)
		return;

	m_pauseOffset = getPlayingOffset();

	ndspChnWaveBufClear(m_channel);
}
Example #3
0
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;

}
Example #4
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);
}
Example #5
0
// 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;
}
Example #6
0
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");

}