}
`}
- fun create(context: NativeActivity, id: Int): NativeMediaPlayer in "Java" `{
+ new create(context: NativeActivity, id: Int): NativeMediaPlayer
+ in "Java" `{
try {
- return self.create(context, (int)id);
+ return MediaPlayer.create(context, (int)id);
}catch(Exception e) {
return null;
}
# Used to play sound, best suited for sounds effects in apps or games
class SoundPool
- # Error gestion
+ # Latest error on this sound pool
var error: nullable Error = null
private var nsoundpool: NativeSoundPool is noinit
+
# The maximum number of simultaneous streams for this SoundPool
var max_streams = 10 is writable
# Init the mediaplayer with a sound resource id
init from_id(context: NativeActivity, id: Int) do
- self.nmedia_player = new NativeMediaPlayer
- self.nmedia_player = nmedia_player.create(context, id)
+ self.nmedia_player = new NativeMediaPlayer.create(context, id)
if self.nmedia_player.is_java_null then
self.error = new Error("Failed to create the MediaPlayer")
self.sound = new Music.priv_init(id, self, self.error)
reset
destroy
end
- self.nmedia_player = self.nmedia_player.create(context, id)
+
+ self.nmedia_player = new NativeMediaPlayer.create(context, id)
if self.nmedia_player.is_java_null then
self.error = new Error("Failed to load a sound")
self.sound = new Music.priv_init(id, self, new Error("Sound loading failed"))
end
redef class PlayableAudio
+ # Flag to know if the user paused the sound
+ # Used when the app pause all sounds or resume all sounds
+ var paused: Bool = false
+
redef init do add_to_sounds(self)
end
redef fun pause do
if self.error != null or not self.is_loaded then return
soundpool.pause_stream(soundpool_id)
+ paused = true
end
redef fun resume do
if self.error != null or not self.is_loaded then return
soundpool.resume(soundpool_id)
+ paused = false
end
end
redef fun pause do
if self.error != null or not self.is_loaded then return
media_player.pause
+ paused = true
end
redef fun resume do
if self.error != null or not self.is_loaded then return
play
+ paused = false
end
end
var default_soundpool: SoundPool is lazy do return new SoundPool
# Get the native audio manager
- fun audio_manager: NativeAudioManager import native_activity in "Java" `{
+ private fun audio_manager: NativeAudioManager import native_activity in "Java" `{
return (AudioManager)App_native_activity(self).getSystemService(Context.AUDIO_SERVICE);
`}
App_native_activity(self).setVolumeControlStream(AudioManager.STREAM_MUSIC);
`}
- # Retrieves a sound with a soundpool in the `assets` folder using its name.
- # Used to play short songs, can play multiple sounds simultaneously
- redef fun load_sound(path) do
- var fd = asset_manager.open_fd(path)
- if not fd.is_java_null then
- return add_to_sounds(default_soundpool.load_asset_fd(fd)).as(Sound)
- else
- var error = new Error("Failed to load Sound {path}")
- return new Sound.priv_init(null, -1, default_soundpool, error)
- end
- end
-
- # Retrieves a music with a media player in the `assets` folder using its name.
- # Used to play long sounds or musics, can't play multiple sounds simultaneously
- redef fun load_music(path) do
- var fd = asset_manager.open_fd(path)
- if not fd.is_java_null then
- return add_to_sounds(default_mediaplayer.data_source_fd(fd)).as(Music)
- else
- var error = new Error("Failed to load music {path}")
- return new Music.priv_init(null, default_mediaplayer, error)
- end
- end
-
# Same as `load_sound` but load the sound from the `res/raw` folder
fun load_sound_from_res(sound_name: String): Sound do
return add_to_sounds(default_soundpool.load_name(resource_manager,self.native_activity, sound_name)).as(Sound)
redef fun on_pause do
super
- for s in sounds do s.pause
+ for s in sounds do
+ # Pausing sounds that are not already paused by user
+ # `s.paused` is set to false because `pause` set it to true
+ # and we want to know which sound has been paused by the user
+ # and which one has been paused by the app
+ if not s.paused then
+ s.pause
+ s.paused = false
+ end
+ end
audio_manager.abandon_audio_focus
end
redef fun on_resume do
super
audio_manager.request_audio_focus
- for s in sounds do s.resume
+ for s in sounds do
+ # Resumes only the sounds paused by the App
+ if not s.paused then s.resume
+ end
end
end