Files
reilua-enhanced/src/audio.c

722 lines
12 KiB
C

#include "main.h"
#include "state.h"
#include "audio.h"
#include "lua_core.h"
/*
## Audio - Audio device management functions
*/
/*
> RL.InitAudioDevice()
Initialize audio device and context
*/
int laudioInitAudioDevice( lua_State* L ) {
InitAudioDevice();
return 0;
}
/*
> RL.CloseAudioDevice()
Close the audio device and context
*/
int laudioCloseAudioDevice( lua_State* L ) {
CloseAudioDevice();
return 0;
}
/*
> isReady = RL.IsAudioDeviceReady()
Check if audio device has been initialized successfully
- Success return bool
*/
int laudioIsAudioDeviceReady( lua_State* L ) {
lua_pushboolean( L, IsAudioDeviceReady() );
return 1;
}
/*
> RL.SetMasterVolume( float volume )
Set master volume (listener)
*/
int laudioSetMasterVolume( lua_State* L ) {
float volume = luaL_checknumber( L, 1 );
SetMasterVolume( volume );
return 0;
}
/*
> isReady = RL.GetMasterVolume()
Get master volume (listener)
- Success return float
*/
int laudioGetMasterVolume( lua_State* L ) {
lua_pushnumber( L, GetMasterVolume() );
return 1;
}
/*
## Audio - Wave/Sound loading/unloading functions
*/
/*
> sound = RL.LoadSound( string fileName )
Load sound from file
- Failure return nil
- Success return Sound
*/
int laudioLoadSound( lua_State* L ) {
if ( FileExists( luaL_checkstring( L, 1 ) ) ) {
uluaPushSound( L, LoadSound( lua_tostring( L, 1 ) ) );
return 1;
}
TraceLog( state->logLevelInvalid, "Invalid file '%s'", lua_tostring( L, 1 ) );
lua_pushnil( L );
return 1;
}
/*
> wave = RL.LoadWave( string fileName )
Load wave data from file
- Failure return nil
- Success return Wave
*/
int laudioLoadWave( lua_State* L ) {
if ( FileExists( luaL_checkstring( L, 1 ) ) ) {
uluaPushWave( L, LoadWave( lua_tostring( L, 1 ) ) );
return 1;
}
TraceLog( state->logLevelInvalid, "Invalid file '%s'", lua_tostring( L, 1 ) );
lua_pushnil( L );
return 1;
}
/*
> wave = RL.LoadWaveFromMemory( string fileType, Buffer data )
Load wave from memory buffer, fileType refers to extension: i.e. '.wav'
- Success return Wave
*/
int laudioLoadWaveFromMemory( lua_State* L ) {
const char* fileType = luaL_checkstring( L, 1 );
Buffer* buffer = uluaGetBuffer( L, 2 );
uluaPushWave( L, LoadWaveFromMemory( fileType, buffer->data, buffer->size ) );
return 1;
}
/*
> isReady = RL.IsWaveReady( Wave wave )
Checks if wave data is ready
- Success return bool
*/
int laudioIsWaveReady( lua_State* L ) {
Wave* wave = uluaGetWave( L, 1 );
lua_pushboolean( L, IsWaveReady( *wave ) );
return 1;
}
/*
> sound = RL.LoadSoundFromWave( Wave wave )
Load sound from wave data
- Success return Sound
*/
int laudioLoadSoundFromWave( lua_State* L ) {
Wave* wave = uluaGetWave( L, 1 );
uluaPushSound( L, LoadSoundFromWave( *wave ) );
return 1;
}
/*
> sound = RL.LoadSoundAlias( Sound source )
Create a new sound that shares the same sample data as the source sound, does not own the sound data
- Success return Sound
*/
int laudioLoadSoundAlias( lua_State* L ) {
Sound* source = uluaGetSound( L, 1 );
uluaPushSound( L, LoadSoundAlias( *source ) );
return 1;
}
/*
> isReady = RL.IsSoundReady( Sound sound )
Checks if a sound is ready
- Success return bool
*/
int laudioIsSoundReady( lua_State* L ) {
Sound* sound = uluaGetSound( L, 1 );
lua_pushboolean( L, IsSoundReady( *sound ) );
return 1;
}
/*
> RL.UpdateSound( Sound sound, Buffer data, int sampleCount )
Update sound buffer with new data
*/
int laudioUpdateSound( lua_State* L ) {
Sound* sound = uluaGetSound( L, 1 );
Buffer* buffer = uluaGetBuffer( L, 2 );
int sampleCount = luaL_checkinteger( L, 3 );
UpdateSound( *sound, buffer->data, sampleCount );
return 0;
}
/*
> RL.UnloadWave( Wave wave )
Unload wave data
*/
int laudioUnloadWave( lua_State* L ) {
Wave* wave = uluaGetWave( L, 1 );
UnloadWave( *wave );
memset( wave, 0, sizeof( Wave ) );
return 0;
}
/*
> RL.UnloadSound( Sound sound )
Unload sound
*/
int laudioUnloadSound( lua_State* L ) {
Sound* sound = uluaGetSound( L, 1 );
UnloadSound( *sound );
memset( sound, 0, sizeof( Sound ) );
return 0;
}
/*
> RL.UnloadSoundAlias( Sound alias )
Unload a sound alias (does not deallocate sample data)
*/
int laudioUnloadSoundAlias( lua_State* L ) {
Sound* alias = uluaGetSound( L, 1 );
UnloadSoundAlias( *alias );
memset( alias, 0, sizeof( Sound ) );
return 0;
}
/*
> success = RL.ExportWave( Wave wave, string fileName )
Export wave data to file, returns true on success
- Success return bool
*/
int laudioExportWave( lua_State* L ) {
Wave* wave = uluaGetWave( L, 1 );
lua_pushboolean( L, ExportWave( *wave, luaL_checkstring( L, 2 ) ) );
return 1;
}
/*
> success = RL.ExportWaveAsCode( Wave wave, string fileName )
Export wave sample data to code (.h), returns true on success
- Success return true
*/
int laudioExportWaveAsCode( lua_State* L ) {
Wave* wave = uluaGetWave( L, 1 );
lua_pushboolean( L, ExportWaveAsCode( *wave, luaL_checkstring( L, 2 ) ) );
return 1;
}
/*
## Audio - Wave/Sound management functions
*/
/*
> RL.PlaySound( Sound sound )
Play a sound
*/
int laudioPlaySound( lua_State* L ) {
Sound* sound = uluaGetSound( L, 1 );
PlaySound( *sound );
return 0;
}
/*
> RL.StopSound( Sound sound )
Stop playing a sound
*/
int laudioStopSound( lua_State* L ) {
Sound* sound = uluaGetSound( L, 1 );
StopSound( *sound );
return 0;
}
/*
> RL.PauseSound( Sound sound )
Pause a sound
*/
int laudioPauseSound( lua_State* L ) {
Sound* sound = uluaGetSound( L, 1 );
PauseSound( *sound );
return 0;
}
/*
> RL.ResumeSound( Sound sound )
Resume a paused sound
*/
int laudioResumeSound( lua_State* L ) {
Sound* sound = uluaGetSound( L, 1 );
ResumeSound( *sound );
return 0;
}
/*
> playing = RL.IsSoundPlaying( Sound sound )
Check if a sound is currently playing
- Success return bool
*/
int laudioIsSoundPlaying( lua_State* L ) {
Sound* sound = uluaGetSound( L, 1 );
lua_pushboolean( L, IsSoundPlaying( *sound ) );
return 1;
}
/*
> RL.SetSoundVolume( Sound sound, float volume )
Set volume for a sound (1.0 is max level)
*/
int laudioSetSoundVolume( lua_State* L ) {
Sound* sound = uluaGetSound( L, 1 );
float volume = luaL_checknumber( L, 2 );
SetSoundVolume( *sound, volume );
return 0;
}
/*
> RL.SetSoundPitch( Sound sound, float pitch )
Set pitch for a sound (1.0 is base level)
*/
int laudioSetSoundPitch( lua_State* L ) {
Sound* sound = uluaGetSound( L, 1 );
float pitch = luaL_checknumber( L, 2 );
SetSoundPitch( *sound, pitch );
return 0;
}
/*
> RL.SetSoundPan( Sound sound, float pan )
Set pan for a sound (0.5 is center)
*/
int laudioSetSoundPan( lua_State* L ) {
Sound* sound = uluaGetSound( L, 1 );
float pan = luaL_checknumber( L, 2 );
SetSoundPan( *sound, pan );
return 0;
}
/*
> RL.WaveFormat( Wave wave, int sampleRate, int sampleSize, int channels )
Convert wave data to desired format
*/
int laudioWaveFormat( lua_State* L ) {
Wave* wave = uluaGetWave( L, 1 );
int sampleRate = luaL_checkinteger( L, 2 );
int sampleSize = luaL_checkinteger( L, 3 );
int channels = luaL_checkinteger( L, 4 );
WaveFormat( wave, sampleRate, sampleSize, channels );
return 0;
}
/*
> samples = RL.LoadWaveSamples( Wave wave )
Load samples data from wave as a 32bit float data array
- Success return float{}
*/
int laudioLoadWaveSamples( lua_State* L ) {
Wave* wave = uluaGetWave( L, 1 );
float* samples = LoadWaveSamples( *wave );
lua_createtable( L, wave->frameCount * wave->channels, 0 );
for ( int i = 0; i < wave->frameCount * wave->channels; ++i ) {
lua_pushnumber( L, samples[i] );
lua_rawseti( L, -2, i+1 );
}
UnloadWaveSamples( samples );
return 1;
}
/*
> wave = RL.WaveCopy( Wave wave )
Copy a wave to a new wave
- Success return Wave
*/
int laudioWaveCopy( lua_State* L ) {
Wave* wave = uluaGetWave( L, 1 );
uluaPushWave( L, WaveCopy( *wave ) );
return 1;
}
/*
> RL.WaveCrop( Wave wave, int initSample, int finalSample )
Crop a wave to defined samples range
*/
int laudioWaveCrop( lua_State* L ) {
Wave* wave = uluaGetWave( L, 1 );
int initSample = luaL_checkinteger( L, 2 );
int finalSample = luaL_checkinteger( L, 3 );
WaveCrop( wave, initSample, finalSample );
return 0;
}
/*
## Audio - Music management functions
*/
/*
> music = RL.LoadMusicStream( string fileName )
Load music stream from file
- Success return Music
*/
int laudioLoadMusicStream( lua_State* L ) {
if ( FileExists( luaL_checkstring( L, 1 ) ) ) {
uluaPushMusic( L, LoadMusicStream( lua_tostring( L, 1 ) ) );
return 1;
}
TraceLog( state->logLevelInvalid, "Invalid file '%s'", lua_tostring( L, 1 ) );
lua_pushnil( L );
return 1;
}
/*
> music = RL.LoadMusicStreamFromMemory( string fileType, Buffer data )
Load music stream from data
- Success return Music
*/
int laudioLoadMusicStreamFromMemory( lua_State* L ) {
const char* fileType = luaL_checkstring( L, 1 );
Buffer* buffer = uluaGetBuffer( L, 2 );
uluaPushMusic( L, LoadMusicStreamFromMemory( fileType, buffer->data, buffer->size ) );
return 1;
}
/*
> isReady = RL.IsMusicReady( Music music )
Checks if a music stream is ready
- Success return bool
*/
int laudioIsMusicReady( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
lua_pushboolean( L, IsMusicReady( *music ) );
return 1;
}
/*
> RL.UnloadMusicStream( Music music )
Unload music stream
*/
int laudioUnloadMusicStream( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
UnloadMusicStream( *music );
memset( music, 0, sizeof( Music ) );
return 0;
}
/*
> RL.PlayMusicStream( Music music )
Start music playing
*/
int laudioPlayMusicStream( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
PlayMusicStream( *music );
return 0;
}
/*
> playing = RL.IsMusicStreamPlaying( Music music )
Check if music is playing
- Success return bool
*/
int laudioIsMusicStreamPlaying( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
lua_pushboolean( L, IsMusicStreamPlaying( *music ) );
return 1;
}
/*
> RL.UpdateMusicStream( Music music )
Updates buffers for music streaming
*/
int laudioUpdateMusicStream( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
UpdateMusicStream( *music );
return 0;
}
/*
> RL.StopMusicStream( Music music )
Stop music playing
*/
int laudioStopMusicStream( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
StopMusicStream( *music );
return 0;
}
/*
> RL.PauseMusicStream( Music music )
Pause music playing
*/
int laudioPauseMusicStream( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
PauseMusicStream( *music );
return 0;
}
/*
> RL.ResumeMusicStream( Music music )
Resume playing paused music
*/
int laudioResumeMusicStream( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
ResumeMusicStream( *music );
return 0;
}
/*
> RL.SeekMusicStream( Music music, float position )
Seek music to a position (in seconds)
*/
int laudioSeekMusicStream( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
float position = luaL_checknumber( L, 2 );
SeekMusicStream( *music, position );
return 0;
}
/*
> RL.SetMusicVolume( Music music, float volume )
Set volume for music (1.0 is max level)
*/
int laudioSetMusicVolume( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
float volume = luaL_checknumber( L, 2 );
SetMusicVolume( *music, volume );
return 0;
}
/*
> RL.SetMusicPitch( Music music, float pitch )
Set pitch for a music (1.0 is base level)
*/
int laudioSetMusicPitch( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
float pitch = luaL_checknumber( L, 2 );
SetMusicPitch( *music, pitch );
return 0;
}
/*
> RL.SetMusicPan( Music music, float pan )
Set pan for a music (0.5 is center)
*/
int laudioSetMusicPan( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
float pan = luaL_checknumber( L, 2 );
SetMusicPitch( *music, pan );
return 0;
}
/*
> RL.SetMusicLooping( Music music, bool looping )
Set looping for a music
*/
int laudioSetMusicLooping( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
bool looping = uluaGetBoolean( L, 2 );
music->looping = looping;
return 0;
}
/*
> looping = RL.GetMusicLooping( Music music )
Get looping of a music
- Success return bool
*/
int laudioGetMusicLooping( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
lua_pushboolean( L, music->looping );
return 1;
}
/*
> length = RL.GetMusicTimeLength( Music music )
Get music time length (in seconds)
- Success return float
*/
int laudioGetMusicTimeLength( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
lua_pushnumber( L, GetMusicTimeLength( *music ) );
return 1;
}
/*
> timePlayed = RL.GetMusicTimePlayed( Music music )
Get current music time played (in seconds)
- Success return float
*/
int laudioGetMusicTimePlayed( lua_State* L ) {
Music* music = uluaGetMusic( L, 1 );
lua_pushnumber( L, GetMusicTimePlayed( *music ) );
return 1;
}