music: merge Music_Play signatures via trx

This commit is contained in:
Marcin Kurczewski 2025-02-02 23:30:32 +01:00
parent 17309bc30a
commit 1d03d434bf
12 changed files with 90 additions and 89 deletions

View file

@ -1,5 +1,22 @@
#pragma once
#include "./enum.h"
#include "./ids.h"
// Stops playing current track and plays a single track.
//
// MPM_ALWAYS:
// Plays the track once. Once playback is done, if there is an active looped
// track, the playback resumes from the start of the looped track.
// MPM_LOOPED:
// Activates looped playback for the chosen track.
// MPM_TRACKED:
// A track with this play mode will not trigger in succession.
// MPM_DELAYED:
// A track does not get played and instead is only marked for later playback.
// The track to play is available with Music_GetDelayedTrack().
bool Music_Play(MUSIC_TRACK_ID track, MUSIC_PLAY_MODE mode);
// Stops any music, whether looped or active speech.
extern void Music_Stop(void);

View file

@ -0,0 +1,8 @@
#pragma once
typedef enum {
MPM_ALWAYS,
MPM_LOOPED,
MPM_DELAYED,
MPM_TRACKED,
} MUSIC_PLAY_MODE;

View file

@ -195,7 +195,7 @@ static DECLARE_GF_EVENT_HANDLER(M_HandlePlayLevel)
static DECLARE_GF_EVENT_HANDLER(M_HandlePlayMusic)
{
Music_Play((int32_t)(intptr_t)event->data);
Music_Play((int32_t)(intptr_t)event->data, MPM_ALWAYS);
return (GF_COMMAND) { .action = GF_NOOP };
}

View file

@ -900,7 +900,7 @@ bool Level_Initialise(const GF_LEVEL *const level)
const bool disable_music =
level->type == GFL_TITLE && !g_Config.audio.enable_music_in_menu;
if (level->music_track >= 0 && !disable_music) {
Music_PlayLooped(level->music_track);
Music_Play(level->music_track, MPM_LOOPED);
}
Viewport_SetFOV(-1);

View file

@ -12,14 +12,16 @@
#include <stdio.h>
static const char *m_Extensions[] = { ".flac", ".ogg", ".mp3", ".wav",
nullptr };
static const char *m_Extensions[] = {
".flac", ".ogg", ".mp3", ".wav", nullptr,
};
static bool m_Muted = false;
static int16_t m_Volume = 0;
static int m_AudioStreamID = -1;
static MUSIC_TRACK_ID m_TrackCurrent = MX_INACTIVE;
static MUSIC_TRACK_ID m_TrackLastPlayed = MX_INACTIVE;
static MUSIC_TRACK_ID m_TrackDelayed = MX_INACTIVE;
static MUSIC_TRACK_ID m_TrackLooped = MX_INACTIVE;
static void M_SyncVolume(const int32_t audio_stream_id);
@ -71,7 +73,7 @@ static void M_StreamFinished(int stream_id, void *user_data)
m_AudioStreamID = -1;
m_TrackCurrent = MX_INACTIVE;
if (m_TrackLooped >= 0) {
Music_PlayLooped(m_TrackLooped);
Music_Play(m_TrackLooped, MPM_LOOPED);
}
}
}
@ -86,55 +88,38 @@ void Music_Shutdown(void)
Audio_Shutdown();
}
bool Music_Play(MUSIC_TRACK_ID track)
bool Music_Play(const MUSIC_TRACK_ID track_id, const MUSIC_PLAY_MODE mode)
{
if (track == m_TrackCurrent || track == m_TrackLastPlayed
|| M_IsBrokenTrack(track)) {
if (M_IsBrokenTrack(track_id)) {
return false;
}
if (g_Config.audio.fix_secrets_killing_music && track == MX_SECRET) {
if (mode != MPM_ALWAYS && track_id == m_TrackCurrent) {
return false;
}
if (mode == MPM_TRACKED && track_id == m_TrackLastPlayed) {
return false;
}
if (mode == MPM_DELAYED) {
m_TrackDelayed = track_id;
return false;
}
if (g_Config.audio.fix_secrets_killing_music && track_id == MX_SECRET) {
return Sound_Effect(SFX_SECRET, nullptr, SPM_ALWAYS);
}
if (g_Config.audio.fix_speeches_killing_music && track >= MX_BALDY_SPEECH
&& track <= MX_SKATEKID_SPEECH) {
if (g_Config.audio.fix_speeches_killing_music && track_id >= MX_BALDY_SPEECH
&& track_id <= MX_SKATEKID_SPEECH) {
return Sound_Effect(
SFX_BALDY_SPEECH + track - MX_BALDY_SPEECH, nullptr, SPM_ALWAYS);
SFX_BALDY_SPEECH + track_id - MX_BALDY_SPEECH, nullptr, SPM_ALWAYS);
}
M_StopActiveStream();
char *file_path = M_GetTrackFileName(track);
m_AudioStreamID = Audio_Stream_CreateFromFile(file_path);
Memory_FreePointer(&file_path);
if (m_AudioStreamID < 0) {
LOG_ERROR("All music streams are busy");
return false;
}
m_TrackCurrent = track;
if (track != MX_SECRET) {
m_TrackLastPlayed = track;
}
M_SyncVolume(m_AudioStreamID);
Audio_Stream_SetFinishCallback(m_AudioStreamID, M_StreamFinished, nullptr);
return true;
}
bool Music_PlayLooped(MUSIC_TRACK_ID track)
{
if (track == m_TrackCurrent || track == m_TrackLastPlayed
|| M_IsBrokenTrack(track)) {
return false;
}
M_StopActiveStream();
char *file_path = M_GetTrackFileName(track);
char *file_path = M_GetTrackFileName(track_id);
m_AudioStreamID = Audio_Stream_CreateFromFile(file_path);
Memory_FreePointer(&file_path);
@ -144,10 +129,16 @@ bool Music_PlayLooped(MUSIC_TRACK_ID track)
}
M_SyncVolume(m_AudioStreamID);
Audio_Stream_SetIsLooped(m_AudioStreamID, mode == MPM_LOOPED);
Audio_Stream_SetFinishCallback(m_AudioStreamID, M_StreamFinished, nullptr);
Audio_Stream_SetIsLooped(m_AudioStreamID, true);
m_TrackLooped = track;
m_TrackDelayed = MX_INACTIVE;
if (mode == MPM_LOOPED) {
m_TrackLooped = track_id;
} else {
m_TrackCurrent = track_id;
m_TrackLastPlayed = track_id;
}
return true;
}
@ -156,6 +147,7 @@ void Music_Stop(void)
{
m_TrackCurrent = MX_INACTIVE;
m_TrackLastPlayed = MX_INACTIVE;
m_TrackDelayed = MX_INACTIVE;
m_TrackLooped = MX_INACTIVE;
M_StopActiveStream();
}
@ -170,7 +162,7 @@ void Music_StopTrack(MUSIC_TRACK_ID track)
m_TrackCurrent = MX_INACTIVE;
if (m_TrackLooped >= 0) {
Music_PlayLooped(m_TrackLooped);
Music_Play(m_TrackLooped, MPM_LOOPED);
}
}
@ -225,14 +217,9 @@ void Music_Unpause(void)
Audio_Stream_Unpause(m_AudioStreamID);
}
MUSIC_TRACK_ID Music_GetCurrentTrack(void)
MUSIC_TRACK_ID Music_GetCurrentPlayingTrack(void)
{
return m_TrackCurrent;
}
MUSIC_TRACK_ID Music_GetLastPlayedTrack(void)
{
return m_TrackLastPlayed;
return m_TrackCurrent == MX_INACTIVE ? m_TrackLooped : m_TrackCurrent;
}
MUSIC_TRACK_ID Music_GetCurrentLoopedTrack(void)
@ -240,9 +227,14 @@ MUSIC_TRACK_ID Music_GetCurrentLoopedTrack(void)
return m_TrackLooped;
}
MUSIC_TRACK_ID Music_GetCurrentPlayingTrack(void)
MUSIC_TRACK_ID Music_GetLastPlayedTrack(void)
{
return m_TrackCurrent == MX_INACTIVE ? m_TrackLooped : m_TrackCurrent;
return m_TrackLastPlayed;
}
MUSIC_TRACK_ID Music_GetDelayedTrack(void)
{
return m_TrackDelayed;
}
double Music_GetDuration(void)

View file

@ -10,15 +10,6 @@ bool Music_Init(void);
// Shuts music mixer down.
void Music_Shutdown(void);
// Stops playing current track and plays a single track. Once playback is done,
// if there is an active looped track, the playback resumes from the start of
// the looped track.
bool Music_Play(MUSIC_TRACK_ID track);
// Stops playing current track and plays a single track. Activates looped
// playback for the chosen track.
bool Music_PlayLooped(MUSIC_TRACK_ID track);
// Stops the provided single track and restarts the looped track if applicable.
void Music_StopTrack(MUSIC_TRACK_ID track);
@ -40,17 +31,17 @@ int16_t Music_GetMinVolume(void);
// Gets the maximum possible game volume.
int16_t Music_GetMaxVolume(void);
// Returns the currently playing track. Ignores looped tracks.
MUSIC_TRACK_ID Music_GetCurrentTrack(void);
// Returns the last played track. Ignores looped tracks.
MUSIC_TRACK_ID Music_GetLastPlayedTrack(void);
// Returns the currently playing track. Includes looped music.
MUSIC_TRACK_ID Music_GetCurrentPlayingTrack(void);
// Returns the looped track.
MUSIC_TRACK_ID Music_GetCurrentLoopedTrack(void);
// Returns the currently playing track. Includes looped music.
MUSIC_TRACK_ID Music_GetCurrentPlayingTrack(void);
// Returns the last played track. Ignores looped tracks.
MUSIC_TRACK_ID Music_GetLastPlayedTrack(void);
// Returns the delayed track. Ignores looped tracks.
MUSIC_TRACK_ID Music_GetDelayedTrack(void);
// Get the duration of the current stream in seconds.
double Music_GetDuration(void);

View file

@ -166,7 +166,7 @@ void Natla_Control(int16_t item_num)
natla->flags = 0;
timer = 0;
item->hit_points = NATLA_NEAR_DEATH;
Music_Play(MX_NATLA_SPEECH);
Music_Play(MX_NATLA_SPEECH, MPM_TRACKED);
} else {
if (g_Config.gameplay.target_mode == TLM_SEMI
|| g_Config.gameplay.target_mode == TLM_NONE) {

View file

@ -107,7 +107,7 @@ void SkateKid_Control(int16_t item_num)
if (item->hit_points < SKATE_KID_SPEECH_HITPOINTS
&& !(item->flags & SKATE_KID_SPEECH_STARTED)) {
Music_Play(MX_SKATEKID_SPEECH);
Music_Play(MX_SKATEKID_SPEECH, MPM_TRACKED);
item->flags |= SKATE_KID_SPEECH_STARTED;
}

View file

@ -111,7 +111,7 @@ static void M_TriggerMusicTrack(int16_t track, const TRIGGER *const trigger)
if (trigger->one_shot) {
g_MusicTrackFlags[track] |= IF_ONE_SHOT;
}
Music_Play(track);
Music_Play(track, MPM_TRACKED);
} else {
Music_StopTrack(track);
}
@ -887,7 +887,7 @@ void Room_TestSectorTrigger(const ITEM *const item, const SECTOR *const sector)
}
resume_info->stats.secret_flags |= secret_num;
resume_info->stats.secret_count++;
Music_Play(MX_SECRET);
Music_Play(MX_SECRET, MPM_ALWAYS);
break;
}
}

View file

@ -894,9 +894,9 @@ static bool M_LoadCurrentMusic(JSON_OBJECT *music_obj)
if (g_Config.audio.music_load_condition == MUSIC_LOAD_NON_AMBIENT) {
return true;
}
Music_PlayLooped(current_track);
Music_Play(current_track, MPM_LOOPED);
} else {
Music_Play(current_track);
Music_Play(current_track, MPM_ALWAYS);
}
if (!Music_SeekTimestamp(timestamp)) {

View file

@ -4,16 +4,8 @@
#include <libtrx/game/music.h>
typedef enum {
MPM_ALWAYS,
MPM_LOOPED,
MPM_DELAYED,
MPM_TRACKED,
} MUSIC_PLAY_MODE;
bool Music_Init(void);
void Music_Shutdown(void);
void Music_Play(MUSIC_TRACK_ID track_id, MUSIC_PLAY_MODE mode);
void Music_Stop(void);
bool Music_PlaySynced(int16_t track_id);
double Music_GetTimestamp(void);

View file

@ -114,19 +114,19 @@ void Music_Shutdown(void)
Audio_Stream_Close(m_AudioStreamID);
}
void Music_Play(const MUSIC_TRACK_ID track_id, const MUSIC_PLAY_MODE mode)
bool Music_Play(const MUSIC_TRACK_ID track_id, const MUSIC_PLAY_MODE mode)
{
if (track_id == m_TrackCurrent && mode != MPM_ALWAYS) {
return;
if (mode != MPM_ALWAYS && track_id == m_TrackCurrent) {
return false;
}
if (mode == MPM_TRACKED && track_id == m_TrackLastPlayed) {
return;
return false;
}
if (mode == MPM_DELAYED) {
m_TrackDelayed = track_id;
return;
return false;
}
M_StopActiveStream();
@ -159,6 +159,7 @@ finish:
m_TrackCurrent = track_id;
m_TrackLastPlayed = track_id;
}
return true;
}
void Music_Stop(void)