diff options
| author | jussi | 2023-04-25 18:19:14 +0300 |
|---|---|---|
| committer | jussi | 2023-04-25 18:19:14 +0300 |
| commit | a9ce78128d919e9798d7d2ec043879a4c685a9d1 (patch) | |
| tree | 478e2e5f0536d4db3c5b13b4d8fd5c45b4bae19c /src | |
| parent | 8182c486e64f21c6f95b9108b0e506e603c2a65c (diff) | |
| download | reilua-enhanced-a9ce78128d919e9798d7d2ec043879a4c685a9d1.tar.gz reilua-enhanced-a9ce78128d919e9798d7d2ec043879a4c685a9d1.tar.bz2 reilua-enhanced-a9ce78128d919e9798d7d2ec043879a4c685a9d1.zip | |
Can now have multiple Music objects like other Raylib objects instead of just one.
Diffstat (limited to 'src')
| -rw-r--r-- | src/audio.c | 332 | ||||
| -rw-r--r-- | src/lua_core.c | 3 | ||||
| -rw-r--r-- | src/main.c | 4 | ||||
| -rw-r--r-- | src/state.c | 12 |
4 files changed, 296 insertions, 55 deletions
diff --git a/src/audio.c b/src/audio.c index 5649ab1..1332446 100644 --- a/src/audio.c +++ b/src/audio.c @@ -23,6 +23,16 @@ static bool validWave( size_t id ) { } } +static bool validMusic( size_t id ) { + if ( id < 0 || state->musicCount < id || state->musics[ id ] == NULL ) { + TraceLog( LOG_WARNING, "%s %d", "Invalid music", id ); + return false; + } + else { + return true; + } +} + static void checkSoundRealloc( int i ) { if ( i == state->soundCount ) { state->soundCount++; @@ -53,6 +63,21 @@ static void checkWaveRealloc( int i ) { } } +static void checkMusicRealloc( int i ) { + if ( i == state->musicCount ) { + state->musicCount++; + } + + if ( state->musicCount == state->musicAlloc ) { + state->musicAlloc += ALLOC_PAGE_SIZE; + state->musics = realloc( state->musics, state->musicAlloc * sizeof( Music* ) ); + + for ( i = state->musicCount; i < state->musicAlloc; i++ ) { + state->musics[i] = NULL; + } + } +} + static int newSound() { int i = 0; @@ -81,6 +106,20 @@ static int newWave() { return i; } +static int newMusic() { + int i = 0; + + for ( i = 0; i < state->musicCount; i++ ) { + if ( state->musics[i] == NULL ) { + break; + } + } + state->musics[i] = malloc( sizeof( Music ) ); + checkMusicRealloc( i ); + + return i; +} + /* ## Audio - Audio device management */ @@ -599,91 +638,188 @@ int laudioWaveCrop( lua_State *L ) { */ /* -> success = RL.LoadMusicStream( string fileName ) +> music = RL.LoadMusicStream( string fileName ) Load music stream from file -- Failure return false -- Success return true +- Failure return -1 +- Success return int */ int laudioLoadMusicStream( lua_State *L ) { if ( !lua_isstring( L, 1 ) ) { TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.LoadMusicStream( string fileName )" ); - lua_pushboolean( L, false ); + lua_pushinteger( L, -1 ); return 1; } - if ( FileExists( lua_tostring( L, 1 ) ) ) { - state->music = LoadMusicStream( lua_tostring( L, 1 ) ); - state->music.looping = false; - - lua_pushboolean( L, true ); - } - else { - lua_pushboolean( L, false ); + if ( !FileExists( lua_tostring( L, 1 ) ) ) { + lua_pushinteger( L, -1 ); + return 1; } + int i = newMusic(); + *state->musics[i] = LoadMusicStream( lua_tostring( L, 1 ) ); + state->musics[i]->looping = true; + lua_pushinteger( L, i ); return 1; } /* -> RL.PlayMusicStream() +> success = RL.PlayMusicStream( Music music ) Start music playing + +- Failure return false +- Success return true */ int laudioPlayMusicStream( lua_State *L ) { - PlayMusicStream( state->music ); + if ( !lua_isnumber( L, 1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.PlayMusicStream( Music music )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t musicId = lua_tointeger( L, 1 ); - return 0; + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + PlayMusicStream( *state->musics[ musicId ] ); + lua_pushboolean( L, true ); + + return 1; } /* -> playing = RL.IsMusicStreamPlaying() +> playing = RL.IsMusicStreamPlaying( Music music ) Check if music is playing +- Failure return nil - Success return bool */ int laudioIsMusicStreamPlaying( lua_State *L ) { - lua_pushboolean( L, IsMusicStreamPlaying( state->music ) ); + if ( !lua_isnumber( L, 1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.IsMusicStreamPlaying( Music music )" ); + lua_pushnil( L ); + return 1; + } + size_t musicId = lua_tointeger( L, 1 ); + + if ( !validMusic( musicId ) ) { + lua_pushnil( L ); + return 1; + } + lua_pushboolean( L, IsMusicStreamPlaying( *state->musics[ musicId ] ) ); + + return 1; +} + +/* +> success = RL.UpdateMusicStream( Music music ) + +Updates buffers for music streaming + +- Failure return false +- Success return true +*/ +int laudioUpdateMusicStream( lua_State *L ) { + if ( !lua_isnumber( L, 1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.UpdateMusicStream( Music music )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t musicId = lua_tointeger( L, 1 ); + + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + UpdateMusicStream( *state->musics[ musicId ] ); + lua_pushboolean( L, true ); return 1; } /* -> RL.StopMusicStream() +> success = RL.StopMusicStream( Music music ) Stop music playing + +- Failure return false +- Success return true */ int laudioStopMusicStream( lua_State *L ) { - StopMusicStream( state->music ); + if ( !lua_isnumber( L, 1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.StopMusicStream( Music music )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t musicId = lua_tointeger( L, 1 ); + + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + StopMusicStream( *state->musics[ musicId ] ); + lua_pushboolean( L, true ); - return 0; + return 1; } /* -> RL.PauseMusicStream() +> success = RL.PauseMusicStream( Music music ) Pause music playing + +- Failure return false +- Success return true */ int laudioPauseMusicStream( lua_State *L ) { - PauseMusicStream( state->music ); + if ( !lua_isnumber( L, 1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.PauseMusicStream( Music music )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t musicId = lua_tointeger( L, 1 ); - return 0; + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + PauseMusicStream( *state->musics[ musicId ] ); + lua_pushboolean( L, true ); + + return 1; } /* -> RL.ResumeMusicStream() +> success = RL.ResumeMusicStream( Music music ) Resume playing paused music + +- Failure return false +- Success return true */ int laudioResumeMusicStream( lua_State *L ) { - ResumeMusicStream( state->music ); + if ( !lua_isnumber( L, 1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.ResumeMusicStream( Music music )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t musicId = lua_tointeger( L, 1 ); - return 0; + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + ResumeMusicStream( *state->musics[ musicId ] ); + lua_pushboolean( L, true ); + + return 1; } /* -> success = RL.SeekMusicStream( float position ) +> success = RL.SeekMusicStream( Music music, float position ) Seek music to a position ( in seconds ) @@ -691,21 +827,26 @@ Seek music to a position ( in seconds ) - Success return true */ int laudioSeekMusicStream( lua_State *L ) { - if ( !lua_isnumber( L, 1 ) ) { - TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SeekMusicStream( float position )" ); + if ( !lua_isnumber( L, 1 ) || !lua_isnumber( L, 2 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SeekMusicStream( Music music, float position )" ); lua_pushboolean( L, false ); return 1; } - float position = lua_tonumber( L, 1 ); + size_t musicId = lua_tointeger( L, 1 ); + float position = lua_tonumber( L, 2 ); - SeekMusicStream( state->music, position ); + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + SeekMusicStream( *state->musics[ musicId ], position ); lua_pushboolean( L, true ); return 1; } /* -> success = RL.SetMusicVolume( float volume ) +> success = RL.SetMusicVolume( Music music, float volume ) Set volume for music ( 1.0 is max level ) @@ -713,21 +854,26 @@ Set volume for music ( 1.0 is max level ) - Success return true */ int laudioSetMusicVolume( lua_State *L ) { - if ( !lua_isnumber( L, 1 ) ) { - TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetMusicVolume( float volume )" ); + if ( !lua_isnumber( L, 1 ) || !lua_isnumber( L, 2 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetMusicVolume( Music music, float volume )" ); lua_pushboolean( L, false ); return 1; } - float volume = lua_tonumber( L, 1 ); + size_t musicId = lua_tointeger( L, 1 ); + float volume = lua_tonumber( L, 2 ); - SetMusicVolume( state->music, volume ); + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + SetMusicVolume( *state->musics[ musicId ], volume ); lua_pushboolean( L, true ); return 1; } /* -> success = RL.SetMusicPitch( float pitch ) +> success = RL.SetMusicPitch( Music music, float pitch ) Set pitch for a music ( 1.0 is base level ) @@ -735,21 +881,26 @@ Set pitch for a music ( 1.0 is base level ) - Success return true */ int laudioSetMusicPitch( lua_State *L ) { - if ( !lua_isnumber( L, 1 ) ) { - TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetMusicPitch( float pitch )" ); + if ( !lua_isnumber( L, 1 ) || !lua_isnumber( L, 2 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetMusicPitch( Music music, float pitch )" ); lua_pushboolean( L, false ); return 1; } - float pitch = lua_tonumber( L, 1 ); + size_t musicId = lua_tointeger( L, 1 ); + float pitch = lua_tonumber( L, 2 ); - SetMusicPitch( state->music, pitch ); + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + SetMusicPitch( *state->musics[ musicId ], pitch ); lua_pushboolean( L, true ); return 1; } /* -> success = RL.SetMusicPan( float pan ) +> success = RL.SetMusicPan( Music music, float pan ) Set pan for a music ( 0.5 is center ) @@ -757,41 +908,122 @@ Set pan for a music ( 0.5 is center ) - Success return true */ int laudioSetMusicPan( lua_State *L ) { - if ( !lua_isnumber( L, 1 ) ) { - TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetMusicPan( float pan )" ); + if ( !lua_isnumber( L, 1 ) || !lua_isnumber( L, 2 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetMusicPan( Music music, float pan )" ); lua_pushboolean( L, false ); return 1; } - float pan = lua_tonumber( L, 1 ); + size_t musicId = lua_tointeger( L, 1 ); + float pan = lua_tonumber( L, 2 ); - SetMusicPitch( state->music, pan ); + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + SetMusicPitch( *state->musics[ musicId ], pan ); lua_pushboolean( L, true ); return 1; } /* -> length = RL.GetMusicTimeLength() +> success = RL.SetMusicLooping( Music music, bool looping ) + +Set looping for a music + +- Failure return false +- Success return true +*/ +int laudioSetMusicLooping( lua_State *L ) { + if ( !lua_isnumber( L, 1 ) || !lua_isboolean( L, 2 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.SetMusicLooping( Music music, bool looping )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t musicId = lua_tointeger( L, 1 ); + bool looping = lua_toboolean( L, 2 ); + + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + state->musics[ musicId ]->looping = looping; + lua_pushboolean( L, true ); + + return 1; +} + +/* +> looping = RL.GetMusicLooping( Music music ) + +Get looping of a music + +- Failure return nil +- Success return bool +*/ +int laudioGetMusicLooping( lua_State *L ) { + if ( !lua_isnumber( L, 1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.GetMusicLooping( Music music )" ); + lua_pushnil( L ); + return 1; + } + size_t musicId = lua_tointeger( L, 1 ); + + if ( !validMusic( musicId ) ) { + lua_pushnil( L ); + return 1; + } + lua_pushboolean( L, state->musics[ musicId ]->looping ); + + return 1; +} + +/* +> length = RL.GetMusicTimeLength( Music music ) Get music time length ( in seconds ) +- Failure return false - Success return float */ int laudioGetMusicTimeLength( lua_State *L ) { - lua_pushnumber( L, GetMusicTimeLength( state->music ) ); + if ( !lua_isnumber( L, 1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.GetMusicTimeLength( Music music )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t musicId = lua_tointeger( L, 1 ); + + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + lua_pushnumber( L, GetMusicTimeLength( *state->musics[ musicId ] ) ); return 1; } /* -> played = RL.GetMusicTimePlayed() +> played = RL.GetMusicTimePlayed( Music music ) Get current music time played ( in seconds ) +- Failure return false - Success return float */ int laudioGetMusicTimePlayed( lua_State *L ) { - lua_pushnumber( L, GetMusicTimePlayed( state->music ) ); + if ( !lua_isnumber( L, 1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL.GetMusicTimePlayed( Music music )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t musicId = lua_tointeger( L, 1 ); + + if ( !validMusic( musicId ) ) { + lua_pushboolean( L, false ); + return 1; + } + lua_pushnumber( L, GetMusicTimePlayed( *state->musics[ musicId ] ) ); return 1; } diff --git a/src/lua_core.c b/src/lua_core.c index 6bb6237..6f593d2 100644 --- a/src/lua_core.c +++ b/src/lua_core.c @@ -1153,12 +1153,15 @@ void luaRegister() { assingGlobalFunction( "LoadMusicStream", laudioLoadMusicStream ); assingGlobalFunction( "PlayMusicStream", laudioPlayMusicStream ); assingGlobalFunction( "IsMusicStreamPlaying", laudioIsMusicStreamPlaying ); + assingGlobalFunction( "UpdateMusicStream", laudioUpdateMusicStream ); assingGlobalFunction( "StopMusicStream", laudioStopMusicStream ); assingGlobalFunction( "PauseMusicStream", laudioPauseMusicStream ); assingGlobalFunction( "ResumeMusicStream", laudioResumeMusicStream ); assingGlobalFunction( "SetMusicVolume", laudioSetMusicVolume ); assingGlobalFunction( "SetMusicPitch", laudioSetMusicPitch ); assingGlobalFunction( "SetMusicPan", laudioSetMusicPan ); + assingGlobalFunction( "SetMusicLooping", laudioSetMusicLooping ); + assingGlobalFunction( "GetMusicLooping", laudioGetMusicLooping ); assingGlobalFunction( "GetMusicTimeLength", laudioGetMusicTimeLength ); assingGlobalFunction( "GetMusicTimePlayed", laudioGetMusicTimePlayed ); @@ -65,15 +65,11 @@ int main( int argn, const char **argc ) { if ( WindowShouldClose() ) { state->run = false; } - if ( IsAudioDeviceReady() ) { - UpdateMusicStream( state->music ); - } luaCallProcess(); luaCallDraw(); } luaCallExit(); } - stateFree(); return 1; diff --git a/src/state.c b/src/state.c index 877464e..ed96115 100644 --- a/src/state.c +++ b/src/state.c @@ -42,6 +42,10 @@ bool stateInit( const char *exePath ) { state->soundAlloc = ALLOC_PAGE_SIZE; state->soundCount = 0; state->sounds = malloc( state->soundAlloc * sizeof( Sound* ) ); + /* Musics. */ + state->musicAlloc = ALLOC_PAGE_SIZE; + state->musicCount = 0; + state->musics = malloc( state->musicAlloc * sizeof( Music* ) ); /* Camera2D's. */ state->camera2DAlloc = ALLOC_PAGE_SIZE; state->camera2DCount = 0; @@ -157,6 +161,12 @@ void stateFree() { free( state->sounds[i] ); } } + for ( int i = 0; i < state->musicCount; ++i ) { + if ( state->musics[i] != NULL ) { + UnloadMusicStream( *state->musics[i] ); + free( state->musics[i] ); + } + } for ( int i = 0; i < state->camera2DCount; ++i ) { if ( state->camera2Ds[i] != NULL ) { free( state->camera2Ds[i] ); @@ -213,7 +223,6 @@ void stateFree() { if ( IsAudioDeviceReady() ) { CloseAudioDevice(); - UnloadMusicStream( state->music ); } if ( state->hasWindow ) { CloseWindow(); @@ -227,6 +236,7 @@ void stateFree() { free( state->fonts ); free( state->waves ); free( state->sounds ); + free( state->musics ); free( state->camera2Ds ); free( state->camera3Ds ); free( state->meshes ); |
