4 #if SILICONSTUDIO_PLATFORM_ANDROID
7 using System.Diagnostics;
8 using IOException = Java.IO.IOException;
13 namespace SiliconStudio.
Paradox.Audio
15 partial class AudioEngine
17 private readonly MediaPlayer mediaPlayer =
new MediaPlayer();
19 private void DestroyImpl()
21 SoundEffectInstance.StaticDestroy();
23 mediaPlayer.Release();
26 private void AudioEngineImpl(AudioDevice device)
28 mediaPlayer.Completion += OnMusicCompletion;
29 mediaPlayer.Error += OnMusicError;
30 mediaPlayer.Prepared += OnMusicPrepared;
32 SoundEffectInstance.CreateAudioTracks();
35 private void StopCurrentMusic()
42 private void StartCurrentMusic()
44 if (isMusicPlayerReady)
47 mediaPlayer.PrepareAsync();
50 private void PauseCurrentMusic()
55 private void UpdateMusicVolume()
58 const float volumeAdjustFactor = 0.5f;
60 var vol = volumeAdjustFactor * currentMusic.Volume;
62 mediaPlayer.SetVolume(vol, vol);
65 private void ResetMusicPlayer()
69 isMusicPlayerReady =
false;
74 private Stopwatch loadTime =
new Stopwatch();
75 private void LoadNewMusic(SoundMusic soundMusic)
80 using (var javaFileStream =
new FileInputStream(soundMusic.FileName))
81 mediaPlayer.SetDataSource(javaFileStream.FD, soundMusic.StartPosition, soundMusic.Length);
83 mediaPlayer.PrepareAsync();
85 currentMusic = soundMusic;
90 Logger.Warning(
"The audio file '{0}' could not be opened", soundMusic.FileName);
92 catch (SecurityException)
94 throw new InvalidOperationException(
"The sound file is not accessible anymore.");
96 catch (IllegalArgumentException e)
98 throw new AudioSystemInternalException(
"Error during the SetDataSouce: "+e);
102 private void OnMusicCompletion(
object o,
EventArgs args)
104 musicMediaEvents.Enqueue(
new SoundMusicEventNotification(SoundMusicEvent.EndOfTrackReached, args));
107 private void OnMusicError(
object o, MediaPlayer.ErrorEventArgs args)
109 musicMediaEvents.Enqueue(
new SoundMusicEventNotification(SoundMusicEvent.ErrorOccurred, args));
112 private void OnMusicPrepared(
object o,
EventArgs args)
114 musicMediaEvents.Enqueue(
new SoundMusicEventNotification(SoundMusicEvent.ReadyToBePlayed, args));
117 private void RestartCurrentMusic()
119 mediaPlayer.SeekTo(0);
122 private void PlatformSpecificProcessMusicReady()
126 if(currentMusic != null)
127 Logger.Verbose(
"Time taken for music '{0}' loading = {0}", currentMusic.Name, loadTime.ElapsedMilliseconds);
130 private void ProcessPlayerClosed()
132 throw new AudioSystemInternalException(
"Should never arrive here. (Used only by windows implementation.");
135 private void ProcessMusicMetaData()
137 throw new AudioSystemInternalException(
"Should never arrive here. (Used only by windows implementation.");
140 private void ProcessMusicError(SoundMusicEventNotification eventNotification)
142 if (eventNotification.Event != SoundMusicEvent.ErrorOccurred)
145 var soundMusicName =
"Unknown";
147 if (currentMusic != null)
149 currentMusic.SetStateToStopped();
150 soundMusicName = currentMusic.Name;
153 Logger.Error(
"Error while playing the sound music '{0}'. Details follows:");
155 var errorEvent = (MediaPlayer.ErrorEventArgs)eventNotification.EventData;
156 if (errorEvent.What == MediaError.Unknown && errorEvent.Extra == 0xfffffc0e)
158 Logger.Error(
"The data format of the music file is not supported.");
160 else if ((uint)errorEvent.What == 0xffffffed)
162 Logger.Error(
"The OS did not have enough memory to create the audio track.", soundMusicName);
166 Logger.Error(
" [Details: ErrorCode={1}, Extra={2}]", soundMusicName, errorEvent.What, errorEvent.Extra);
173 private void PauseAudioPlatformSpecific()
178 private void ResumeAudioPlatformSpecific()