X-Git-Url: http://nitlanguage.org diff --git a/lib/android/audio.nit b/lib/android/audio.nit index 40c69c2..d1c50d4 100644 --- a/lib/android/audio.nit +++ b/lib/android/audio.nit @@ -115,9 +115,10 @@ private extern class NativeMediaPlayer in "Java" `{ android.media.MediaPlayer `} } `} - 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; } @@ -208,10 +209,11 @@ end # 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 @@ -366,8 +368,7 @@ class MediaPlayer # 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) @@ -387,7 +388,8 @@ class MediaPlayer 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")) @@ -492,6 +494,10 @@ class MediaPlayer 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 @@ -554,11 +560,13 @@ redef class Sound 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 @@ -616,11 +624,13 @@ redef class Music 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 @@ -638,7 +648,7 @@ redef class App 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); `} @@ -648,30 +658,6 @@ redef class App 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) @@ -684,7 +670,16 @@ redef class App 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 @@ -697,7 +692,10 @@ redef class App 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