mirror of
https://github.com/ctruLua/ctruLua.git
synced 2025-10-27 16:39:29 +00:00
Unload streaming data when stopping audio
Forgot some memory freeing, sorry.
This commit is contained in:
parent
04eb578892
commit
4c9bdf75fa
1 changed files with 35 additions and 7 deletions
|
|
@ -86,7 +86,7 @@ typedef struct {
|
||||||
double prevStartTime; // audio time when last chunk started playing
|
double prevStartTime; // audio time when last chunk started playing
|
||||||
bool eof; // if reached end of file
|
bool eof; // if reached end of file
|
||||||
bool done; // if streaming ended and the stream will be skipped on the next update
|
bool done; // if streaming ended and the stream will be skipped on the next update
|
||||||
// (the struct should be keept in memory until replaced or it will break audio:time())
|
// (the struct should be keept in memory until replaced or audio stopped or it will break audio:time())
|
||||||
|
|
||||||
char* nextData; // the next data to play
|
char* nextData; // the next data to play
|
||||||
ndspWaveBuf* nextWaveBuf;
|
ndspWaveBuf* nextWaveBuf;
|
||||||
|
|
@ -107,6 +107,34 @@ audio_userdata* channels[24];
|
||||||
// Array of the audio_instance that needs to be updated when calling audio.update (indexed per channel).
|
// Array of the audio_instance that needs to be updated when calling audio.update (indexed per channel).
|
||||||
audio_stream* streaming[24];
|
audio_stream* streaming[24];
|
||||||
|
|
||||||
|
// Stop playing audio on a channel, and stop streaming/free memory.
|
||||||
|
void stopAudio(int channel) {
|
||||||
|
ndspChnWaveBufClear(channel);
|
||||||
|
|
||||||
|
// Stop streaming and free data
|
||||||
|
if (streaming[channel] != NULL) {
|
||||||
|
audio_stream* stream = streaming[channel];
|
||||||
|
if (stream->nextWaveBuf != NULL) {
|
||||||
|
free(stream->nextWaveBuf);
|
||||||
|
stream->nextWaveBuf = NULL;
|
||||||
|
}
|
||||||
|
if (stream->nextData != NULL) {
|
||||||
|
linearFree(stream->nextData);
|
||||||
|
stream->nextData = NULL;
|
||||||
|
}
|
||||||
|
if (stream->prevWaveBuf != NULL) {
|
||||||
|
free(stream->prevWaveBuf);
|
||||||
|
stream->prevWaveBuf = NULL;
|
||||||
|
}
|
||||||
|
if (stream->prevData != NULL) {
|
||||||
|
linearFree(stream->prevData);
|
||||||
|
stream->prevData = NULL;
|
||||||
|
}
|
||||||
|
free(stream);
|
||||||
|
streaming[channel] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
Load an audio file.
|
Load an audio file.
|
||||||
OGG Vorbis and PCM WAV file format are currently supported.
|
OGG Vorbis and PCM WAV file format are currently supported.
|
||||||
|
|
@ -542,7 +570,7 @@ static int audio_stop(lua_State *L) {
|
||||||
if (channel == -1) {
|
if (channel == -1) {
|
||||||
for (int i = 0; i <= 23; i++) {
|
for (int i = 0; i <= 23; i++) {
|
||||||
if (ndspChnIsPlaying(i)) {
|
if (ndspChnIsPlaying(i)) {
|
||||||
ndspChnWaveBufClear(i);
|
stopAudio(i);
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -550,7 +578,7 @@ static int audio_stop(lua_State *L) {
|
||||||
luaL_error(L, "channel number must be between 0 and 23");
|
luaL_error(L, "channel number must be between 0 and 23");
|
||||||
} else {
|
} else {
|
||||||
if (ndspChnIsPlaying(channel)) {
|
if (ndspChnIsPlaying(channel)) {
|
||||||
ndspChnWaveBufClear(channel);
|
stopAudio(channel);
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -838,7 +866,7 @@ static int audio_object_play(lua_State *L) {
|
||||||
if (channel < 0 || channel > 23) luaL_error(L, "channel number must be between 0 and 23");
|
if (channel < 0 || channel > 23) luaL_error(L, "channel number must be between 0 and 23");
|
||||||
|
|
||||||
// Set channel parameters
|
// Set channel parameters
|
||||||
ndspChnWaveBufClear(channel);
|
stopAudio(channel);
|
||||||
ndspChnReset(channel);
|
ndspChnReset(channel);
|
||||||
ndspChnInitParams(channel);
|
ndspChnInitParams(channel);
|
||||||
ndspChnSetMix(channel, audio->mix);
|
ndspChnSetMix(channel, audio->mix);
|
||||||
|
|
@ -910,7 +938,7 @@ static int audio_object_stop(lua_State *L) {
|
||||||
if (channel == -1) {
|
if (channel == -1) {
|
||||||
for (int i = 0; i <= 23; i++) {
|
for (int i = 0; i <= 23; i++) {
|
||||||
if (channels[i] == audio && ndspChnIsPlaying(i)) {
|
if (channels[i] == audio && ndspChnIsPlaying(i)) {
|
||||||
ndspChnWaveBufClear(i);
|
stopAudio(i);
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -918,7 +946,7 @@ static int audio_object_stop(lua_State *L) {
|
||||||
luaL_error(L, "channel number must be between 0 and 23");
|
luaL_error(L, "channel number must be between 0 and 23");
|
||||||
} else {
|
} else {
|
||||||
if (channels[channel] == audio && ndspChnIsPlaying(channel)) {
|
if (channels[channel] == audio && ndspChnIsPlaying(channel)) {
|
||||||
ndspChnWaveBufClear(channel);
|
stopAudio(channel);
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -959,7 +987,7 @@ static int audio_object_unload(lua_State *L) {
|
||||||
if (isAudioInitialized) {
|
if (isAudioInitialized) {
|
||||||
for (int i = 0; i <= 23; i++) {
|
for (int i = 0; i <= 23; i++) {
|
||||||
if (channels[i] == audio) {
|
if (channels[i] == audio) {
|
||||||
ndspChnWaveBufClear(i);
|
stopAudio(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue