app::audio: drop the old load_sound and load_music
[nit.git] / lib / android / audio.nit
index 40c69c2..d1c50d4 100644 (file)
@@ -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