mirror of
https://github.com/LostArtefacts/TRX.git
synced 2025-04-28 20:58:07 +03:00
music: merge Music_Play signatures via trx
This commit is contained in:
parent
17309bc30a
commit
1d03d434bf
12 changed files with 90 additions and 89 deletions
|
@ -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);
|
||||
|
||||
|
|
8
src/libtrx/include/libtrx/game/music/enum.h
Normal file
8
src/libtrx/include/libtrx/game/music/enum.h
Normal file
|
@ -0,0 +1,8 @@
|
|||
#pragma once
|
||||
|
||||
typedef enum {
|
||||
MPM_ALWAYS,
|
||||
MPM_LOOPED,
|
||||
MPM_DELAYED,
|
||||
MPM_TRACKED,
|
||||
} MUSIC_PLAY_MODE;
|
|
@ -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 };
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue