mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-08-04 03:07:07 -04:00
WIP refactoring into separate sound and stream contexts
This commit is contained in:
parent
c4a9dfb191
commit
dbec9e8c76
14
src/Audio.c
14
src/Audio.c
@ -300,7 +300,7 @@ static cc_result Music_Buffer(struct AudioChunk* chunk, int maxSamples, struct V
|
|||||||
}
|
}
|
||||||
|
|
||||||
chunk->size = samples * 2;
|
chunk->size = samples * 2;
|
||||||
res2 = Audio_QueueChunk(&music_ctx, chunk);
|
res2 = StreamContext_Enqueue(&music_ctx, chunk);
|
||||||
if (res2) { music_stopping = true; return res2; }
|
if (res2) { music_stopping = true; return res2; }
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -330,7 +330,7 @@ static cc_result Music_PlayOgg(struct Stream* source) {
|
|||||||
|
|
||||||
channels = vorbis->channels;
|
channels = vorbis->channels;
|
||||||
sampleRate = vorbis->sampleRate;
|
sampleRate = vorbis->sampleRate;
|
||||||
if ((res = Audio_SetFormat(&music_ctx, channels, sampleRate, 100))) goto cleanup;
|
if ((res = StreamContext_SetFormat(&music_ctx, channels, sampleRate, 100))) goto cleanup;
|
||||||
|
|
||||||
/* largest possible vorbis frame decodes to blocksize1 * channels samples, */
|
/* largest possible vorbis frame decodes to blocksize1 * channels samples, */
|
||||||
/* so can end up decoding slightly over a second of audio */
|
/* so can end up decoding slightly over a second of audio */
|
||||||
@ -348,7 +348,7 @@ static cc_result Music_PlayOgg(struct Stream* source) {
|
|||||||
}
|
}
|
||||||
if (music_stopping) goto cleanup;
|
if (music_stopping) goto cleanup;
|
||||||
|
|
||||||
res = Audio_Play(&music_ctx);
|
res = StreamContext_Play(&music_ctx);
|
||||||
if (res) goto cleanup;
|
if (res) goto cleanup;
|
||||||
cur = 0;
|
cur = 0;
|
||||||
|
|
||||||
@ -357,11 +357,11 @@ static cc_result Music_PlayOgg(struct Stream* source) {
|
|||||||
/* Don't play music while in the background on Android */
|
/* Don't play music while in the background on Android */
|
||||||
/* TODO: Not use such a terrible approach */
|
/* TODO: Not use such a terrible approach */
|
||||||
if (!Window_Main.Handle.ptr || Window_Main.Inactive) {
|
if (!Window_Main.Handle.ptr || Window_Main.Inactive) {
|
||||||
Audio_Pause(&music_ctx);
|
StreamContext_Pause(&music_ctx);
|
||||||
while ((!Window_Main.Handle.ptr || Window_Main.Inactive) && !music_stopping) {
|
while ((!Window_Main.Handle.ptr || Window_Main.Inactive) && !music_stopping) {
|
||||||
Thread_Sleep(10); continue;
|
Thread_Sleep(10); continue;
|
||||||
}
|
}
|
||||||
Audio_Play(&music_ctx);
|
StreamContext_Play(&music_ctx);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (volume != Audio_MusicVolume) {
|
if (volume != Audio_MusicVolume) {
|
||||||
@ -369,7 +369,7 @@ static cc_result Music_PlayOgg(struct Stream* source) {
|
|||||||
Audio_SetVolume(&music_ctx, volume);
|
Audio_SetVolume(&music_ctx, volume);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = Audio_Poll(&music_ctx, &inUse);
|
res = StreamContext_Update(&music_ctx, &inUse);
|
||||||
if (res) { music_stopping = true; break; }
|
if (res) { music_stopping = true; break; }
|
||||||
|
|
||||||
if (inUse >= AUDIO_MAX_BUFFERS) {
|
if (inUse >= AUDIO_MAX_BUFFERS) {
|
||||||
@ -391,7 +391,7 @@ static cc_result Music_PlayOgg(struct Stream* source) {
|
|||||||
} else {
|
} else {
|
||||||
/* Wait until the buffers finished playing */
|
/* Wait until the buffers finished playing */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (Audio_Poll(&music_ctx, &inUse) || inUse == 0) break;
|
if (StreamContext_Update(&music_ctx, &inUse) || inUse == 0) break;
|
||||||
Thread_Sleep(10);
|
Thread_Sleep(10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
34
src/Audio.h
34
src/Audio.h
@ -64,22 +64,8 @@ void AudioBackend_LoadSounds(void);
|
|||||||
cc_result Audio_Init(struct AudioContext* ctx, int buffers);
|
cc_result Audio_Init(struct AudioContext* ctx, int buffers);
|
||||||
/* Stops any playing audio and then frees the audio context. */
|
/* Stops any playing audio and then frees the audio context. */
|
||||||
void Audio_Close(struct AudioContext* ctx);
|
void Audio_Close(struct AudioContext* ctx);
|
||||||
/* Sets the format of the audio data to be played. */
|
|
||||||
/* NOTE: Changing the format can be expensive, depending on the backend. */
|
|
||||||
cc_result Audio_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate);
|
|
||||||
/* Sets the volume audio data is played at */
|
/* Sets the volume audio data is played at */
|
||||||
void Audio_SetVolume(struct AudioContext* ctx, int volume);
|
void Audio_SetVolume(struct AudioContext* ctx, int volume);
|
||||||
/* Queues the given audio chunk for playing. */
|
|
||||||
/* NOTE: You MUST ensure Audio_Poll indicates a buffer is free before calling this. */
|
|
||||||
/* NOTE: Some backends directly read from the chunk data - therefore you MUST NOT modify it */
|
|
||||||
cc_result Audio_QueueChunk(struct AudioContext* ctx, struct AudioChunk* chunk);
|
|
||||||
/* Begins playing audio. Audio_QueueChunk must have been used before this. */
|
|
||||||
cc_result Audio_Play(struct AudioContext* ctx);
|
|
||||||
/* Polls the audio context and then potentially unqueues buffer */
|
|
||||||
/* Returns the number of buffers being played or queued */
|
|
||||||
/* (e.g. if inUse is 0, no audio buffers are being played or queued) */
|
|
||||||
cc_result Audio_Poll(struct AudioContext* ctx, int* inUse);
|
|
||||||
cc_result Audio_Pause(struct AudioContext* ctx);
|
|
||||||
|
|
||||||
/* Outputs more detailed information about errors with audio. */
|
/* Outputs more detailed information about errors with audio. */
|
||||||
cc_bool Audio_DescribeError(cc_result res, cc_string* dst);
|
cc_bool Audio_DescribeError(cc_result res, cc_string* dst);
|
||||||
@ -95,6 +81,26 @@ cc_result AudioPool_Play(struct AudioData* data);
|
|||||||
void AudioPool_Close(void);
|
void AudioPool_Close(void);
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
/* Sets the format of the audio data to be played. */
|
||||||
|
/* NOTE: Changing the format can be expensive, depending on the backend. */
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate);
|
||||||
|
/* Queues the given audio chunk for playing. */
|
||||||
|
/* NOTE: You MUST ensure StreamContext_Update indicates a buffer is free before calling this. */
|
||||||
|
/* NOTE: Some backends directly read from the chunk data - therefore you MUST NOT modify it */
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk);
|
||||||
|
/* Begins playing audio. StreamContext_Enqueue must have been used before this. */
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx);
|
||||||
|
/* Temporarily pauses playing audio. Can be resumed again using StreamContext_Play. */
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx);
|
||||||
|
/* Updates the audio context and then potentially unqueues buffer */
|
||||||
|
/* Returns the number of buffers in use (i.e. being played or queued to play) */
|
||||||
|
/* (e.g. if inUse is 0, no audio buffers are being played or queued) */
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse);
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
|
@ -128,6 +128,54 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -137,7 +185,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
|
|||||||
|
|
||||||
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
||||||
cc_result res;
|
cc_result res;
|
||||||
Audio_SetVolume(ctx, data->volume);
|
|
||||||
|
|
||||||
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
||||||
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
||||||
|
@ -135,6 +135,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -144,7 +168,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
|
|||||||
|
|
||||||
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
||||||
cc_result res;
|
cc_result res;
|
||||||
Audio_SetVolume(ctx, data->volume);
|
|
||||||
|
|
||||||
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
||||||
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
||||||
|
@ -142,6 +142,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -151,7 +175,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
|
|||||||
|
|
||||||
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
||||||
cc_result res;
|
cc_result res;
|
||||||
Audio_SetVolume(ctx, data->volume);
|
|
||||||
|
|
||||||
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
||||||
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
||||||
|
@ -40,6 +40,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
|
@ -173,6 +173,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -182,7 +206,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
|
|||||||
|
|
||||||
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
||||||
cc_result res;
|
cc_result res;
|
||||||
Audio_SetVolume(ctx, data->volume);
|
|
||||||
|
|
||||||
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
||||||
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
||||||
|
@ -257,6 +257,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -267,7 +291,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
|
|||||||
|
|
||||||
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
||||||
cc_result res;
|
cc_result res;
|
||||||
Audio_SetVolume(ctx, data->volume);
|
|
||||||
|
|
||||||
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
||||||
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
||||||
|
@ -224,6 +224,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
|
@ -174,6 +174,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -183,7 +207,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
|
|||||||
|
|
||||||
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
||||||
cc_result res;
|
cc_result res;
|
||||||
Audio_SetVolume(ctx, data->volume);
|
|
||||||
|
|
||||||
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
||||||
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
||||||
|
@ -358,6 +358,30 @@ cc_result Audio_SetFormat(struct AudioContext* ctx, int channels, int sampleRate
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -369,7 +393,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
|
|||||||
|
|
||||||
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
||||||
cc_result res;
|
cc_result res;
|
||||||
Audio_SetVolume(ctx, data->volume);
|
|
||||||
|
|
||||||
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
||||||
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
||||||
|
@ -59,6 +59,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -68,14 +92,7 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
||||||
cc_result res;
|
return interop_AudioPlay(ctx->contextID, data->chunk.data, data->rate);
|
||||||
Audio_SetVolume(ctx, data->volume);
|
|
||||||
|
|
||||||
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
|
||||||
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
|
||||||
if ((res = Audio_Play(ctx))) return res;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) {
|
cc_result SoundContext_PollBusy(struct AudioContext* ctx, cc_bool* isBusy) {
|
||||||
|
@ -56,6 +56,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -66,7 +90,6 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
|
|||||||
|
|
||||||
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
||||||
cc_result res;
|
cc_result res;
|
||||||
Audio_SetVolume(ctx, data->volume);
|
|
||||||
|
|
||||||
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
||||||
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
||||||
|
@ -144,6 +144,30 @@ cc_result Audio_Poll(struct AudioContext* ctx, int* inUse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*########################################################################################################################*
|
||||||
|
*------------------------------------------------------Stream context-----------------------------------------------------*
|
||||||
|
*#########################################################################################################################*/
|
||||||
|
cc_result StreamContext_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate) {
|
||||||
|
return Audio_SetFormat(ctx, channels, sampleRate, playbackRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Enqueue(struct AudioContext* ctx, struct AudioChunk* chunk) {
|
||||||
|
return Audio_QueueChunk(ctx, chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Play(struct AudioContext* ctx) {
|
||||||
|
return Audio_Play(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Pause(struct AudioContext* ctx) {
|
||||||
|
return Audio_Pause(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_result StreamContext_Update(struct AudioContext* ctx, int* inUse) {
|
||||||
|
return Audio_Poll(ctx, inUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Sound context------------------------------------------------------*
|
*------------------------------------------------------Sound context------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -155,11 +179,9 @@ cc_bool SoundContext_FastPlay(struct AudioContext* ctx, struct AudioData* data)
|
|||||||
|
|
||||||
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
cc_result SoundContext_PlayData(struct AudioContext* ctx, struct AudioData* data) {
|
||||||
cc_result res;
|
cc_result res;
|
||||||
Audio_SetVolume(ctx, data->volume);
|
|
||||||
|
|
||||||
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
if ((res = Audio_SetFormat(ctx, data->channels, data->sampleRate, data->rate))) return res;
|
||||||
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
if ((res = Audio_QueueChunk(ctx, &data->chunk))) return res;
|
||||||
if ((res = Audio_Play(ctx))) return res;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,12 @@ void Audio_Warn(cc_result res, const char* action) {
|
|||||||
/* achieve higher speed by playing samples at higher sample rate */
|
/* achieve higher speed by playing samples at higher sample rate */
|
||||||
#define Audio_AdjustSampleRate(sampleRate, playbackRate) ((sampleRate * playbackRate) / 100)
|
#define Audio_AdjustSampleRate(sampleRate, playbackRate) ((sampleRate * playbackRate) / 100)
|
||||||
|
|
||||||
|
static cc_result Audio_SetFormat(struct AudioContext* ctx, int channels, int sampleRate, int playbackRate);
|
||||||
|
static cc_result Audio_QueueChunk(struct AudioContext* ctx, struct AudioChunk* chunk);
|
||||||
|
static cc_result Audio_Play(struct AudioContext* ctx);
|
||||||
|
static cc_result Audio_Poll(struct AudioContext* ctx, int* inUse);
|
||||||
|
static cc_result Audio_Pause(struct AudioContext* ctx);
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*---------------------------------------------------Common backend code---------------------------------------------------*
|
*---------------------------------------------------Common backend code---------------------------------------------------*
|
||||||
@ -128,8 +134,9 @@ cc_result AudioPool_Play(struct AudioData* data) {
|
|||||||
|
|
||||||
if ((res = SoundContext_PollBusy(ctx, &isBusy))) return res;
|
if ((res = SoundContext_PollBusy(ctx, &isBusy))) return res;
|
||||||
if (isBusy) continue;
|
if (isBusy) continue;
|
||||||
|
|
||||||
if (!SoundContext_FastPlay(ctx, data)) continue;
|
if (!SoundContext_FastPlay(ctx, data)) continue;
|
||||||
|
|
||||||
|
Audio_SetVolume(ctx, data->volume);
|
||||||
return SoundContext_PlayData(ctx, data);
|
return SoundContext_PlayData(ctx, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,6 +149,7 @@ cc_result AudioPool_Play(struct AudioData* data) {
|
|||||||
if (res) return res;
|
if (res) return res;
|
||||||
if (isBusy) continue;
|
if (isBusy) continue;
|
||||||
|
|
||||||
|
Audio_SetVolume(ctx, data->volume);
|
||||||
return SoundContext_PlayData(ctx, data);
|
return SoundContext_PlayData(ctx, data);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user