AIR on Android ANR at android.media.AudioTrack crash logs
Hey, first thanks for AIR that is brilliant crossplatform! But recentlly i notice a lot of ANE crashes in Google Play Developer Console. Can you tell me what i might do wrong?
ANR:
"Thread-7016" prio=5 tid=22 SUSPENDED
| group="main" sCount=1 dsCount=0 obj=0x41fd28b8 self=0x62a73f48 |
| sysTid=4981 nice=-16 sched=0/0 cgrp=apps handle=1681878264 |
| state=S schedstat=( 17694319000 996630000 13015 ) utm=1678 stm=91 core=0 #00 pc 0001c5d0 /system/lib/libc.so (__futex_syscall3+8) #01 pc 0000e6a8 /system/lib/libc.so (__pthread_cond_timedwait_relative+48) #02 pc 0000e708 /system/lib/libc.so (__pthread_cond_timedwait+64) #03 pc 000530f3 /system/lib/libdvm.so #04 pc 000536b5 /system/lib/libdvm.so (dvmChangeStatus(Thread*, ThreadStatus)+34) #05 pc 00049327 /system/lib/libdvm.so #06 pc 0004af6f /system/lib/libdvm.so #07 pc 0007ee13 /system/lib/libandroid_runtime.so #08 pc 0001dc4c /system/lib/libdvm.so (dvmPlatformInvoke+112) #09 pc 0004decf /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398) #10 pc 00027060 /system/lib/libdvm.so #11 pc 0002b5ec /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184) #12 pc 0005fddf /system/lib/libdvm.so (dvmCallMethodA(Thread*, Method const*, Object*, bool, JValue*, jvalue const*)+314) #13 pc 0004c821 /system/lib/libdvm.so #14 pc 00156f61 /data/app-lib/air.com.goodgamestudios.empirefourkingdoms-2/libCore.so #15 pc 0015761f /data/app-lib/air.com.goodgamestudios.empirefourkingdoms-2/libCore.so #16 pc 002079cd /data/app-lib/air.com.goodgamestudios.empirefourkingdoms-2/libCore.so #17 pc 00207af5 /data/app-lib/air.com.goodgamestudios.empirefourkingdoms-2/libCore.so at android.media.AudioTrack.native_write_byte(Native Method) at android.media.AudioTrack.write(AudioTrack.java:996) at dalvik.system.NativeStart.run(Native Method) |
"AudioTrack" prio=10 tid=21 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x41fd27d8 self=0x643f68a8 |
| sysTid=4980 nice=-16 sched=0/0 cgrp=apps handle=1681876576 |
| state=S schedstat=( 1161365000 452181000 17511 ) utm=41 stm=75 core=0 #00 pc 0001bbbc /system/lib/libc.so (nanosleep+12) #01 pc 0002df0f /system/lib/libc.so (usleep+30) #02 pc 00046117 /system/lib/libmedia.so (android::AudioTrack::processAudioBuffer(android::sp<android::AudioTrack::AudioTrackThread> const&)+398) #03 pc 00046201 /system/lib/libmedia.so (android::AudioTrack::AudioTrackThread::threadLoop()+72) #04 pc 00011a1d /system/lib/libutils.so (android::Thread::_threadLoop(void*)+104) #05 pc 0004b631 /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+68) #06 pc 00011581 /system/lib/libutils.so #07 pc 0000ca58 /system/lib/libc.so (__thread_entry+72) #08 pc 0000cbd4 /system/lib/libc.so (pthread_create+208) at dalvik.system.NativeStart.run(Native Method) |
Could you tell me what i do wrong in Sound Controller:
{
import br.com.stimuli.loading.BulkLoader;
import com.flashdynamix.motion.Tweensy;
import com.greensock.TweenLite;
import com.greensock.plugins.TweenPlugin;
import com.greensock.plugins.VolumePlugin;
import com.gskinner.utils.FramerateThrottler;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.media.AudioPlaybackMode;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
import flash.media.SoundTransform;
import flash.utils.ByteArray;
import flash.utils.Dictionary;
public class BasicSoundController extends EventDispatcher
{
private static var BUFFER_SONG_LEGTH:Number = 0.4;
private var _globalSoundTransform:SoundTransform = new SoundTransform();
protected var _effectsTransform:SoundTransform = new SoundTransform();
private var _musicTransform:SoundTransform = new SoundTransform();
private var _isMuted:Boolean = false;
private var _isEffectsMuted:Boolean = false;
private var _isMusicMuted:Boolean = false;
private var _globalSavedVolume:Number = 1;
private var _musicSavedVolume:Number = 1;
private var _effectsSavedVolume:Number = 1;
private var _currentSongChannel:SoundChannel;
private var _currentSong:Sound;
private var _currentSongString:String;
private var _currentSongLoops:int;
private var _loadedSongs:Dictionary;
private var _playingSoundEffects:Array;
private var _externalyLoadedSounds:Dictionary;
private var _musicVolume:Number = .3;
public function BasicSoundController()
{
TweenPlugin.activate( [VolumePlugin] );
if (!musicOn)
{
muteMusic();
}
if (!sfxOn)
{
muteEffects();
}
}
public function initialize():void
{
SoundMixer.audioPlaybackMode = AudioPlaybackMode.AMBIENT;
_loadedSongs = new Dictionary();
_externalyLoadedSounds = new Dictionary();
_playingSoundEffects = [];
FramerateThrottler.addThrottleDelegates( "Sound", muteAll, unMuteAll );
}
protected function playSong( song:Sound, loops:int = 1 ):void
{
if (song == null)
{
return;
}
if (_currentSongChannel != null)
{
_currentSongChannel.stop();
}
_currentSongChannel = song.play( 0, loops /*int.MAX_VALUE*/, _musicTransform );
fadeMusicIn();
if (_currentSongChannel != null)
{
_currentSongChannel.addEventListener( Event.SOUND_COMPLETE, onCurrentSongReachedEnd );
_currentSong = song;
}
}
public function fadeMusicIn():void
{
TweenLite.from(_currentSongChannel,30,{volume:0});
}
public function stopAllLoopedSoundEffects():void
{
for (var i:int = 0; i < _playingSoundEffects.length; i++)
{
var sfx:SoundChannel = _playingSoundEffects;
sfx.stop();
sfx = null;
}
_playingSoundEffects = [];
}
public function playMusic( nameString:String, loops:int = 1, restart:Boolean = false ):void
{
if (_currentSongString == nameString && !restart)
{
return;
}
_currentSongString = nameString;
_currentSongLoops = loops;
if (_externalyLoadedSounds[nameString])
{
var song:Sound = _externalyLoadedSounds[nameString];
if (song.bytesTotal > 0)
{
_currentSongChannel = song.play( 0, _currentSongLoops );
_musicTransform.volume = _musicVolume;
applyMusicSoundTransform();
fadeMusicIn();
}
}
else
{
var file:File = File.applicationStorageDirectory.resolvePath( "sound/" + nameString );
var fileExists:Boolean = file.exists;
if (fileExists)
{
loadMusicFileFromStorage( file );
}
else
{
loadMusicFileFromServer( nameString );
}
}
}
private function loadMusicFileFromServer( nameString:String ):void
{
ExternalAssetsController.instance.loadAssets( EnvGlobalsHandler.globals.assetsURL + "sound/" + nameString, nameString, onItemAssetsLoadedFromFileServer, BulkLoader.TYPE_BINARY, [nameString], BasicModel.languageData.getTextById( "loading_empire_text_sounds" ) );
}
private function onItemAssetsLoadedFromFileServer( bytes:ByteArray, name:String ):void
{
ExternalAssetsController.instance.checkDirectory( "sound/" )
ExternalAssetsController.instance.saveBytesToDisk( bytes, "sound/" + name )
var song:Sound = new Sound();
song.loadCompressedDataFromByteArray( bytes, bytes.length );
_loadedSongs[_currentSongString] = song;
playSong( song, _currentSongLoops );
}
private function loadMusicFileFromStorage( file:File ):void
{
var song:Sound = new Sound();
var bytes:ByteArray = new ByteArray();
var fileStream:FileStream = new FileStream();
fileStream.open( file, FileMode.READ );
fileStream.readBytes( bytes, 0, fileStream.bytesAvailable );
fileStream.close();
fileStream = null;
song.loadCompressedDataFromByteArray( bytes, bytes.length );
_loadedSongs[_currentSongString] = song;
playSong( song, _currentSongLoops );
}
public function stopMusic():void
{
if (_currentSongChannel != null)
{
_currentSongChannel.stop();
_currentSongChannel.removeEventListener( Event.SOUND_COMPLETE, onCurrentSongReachedEnd );
}
_currentSongString = "";
}
public function stopAllSounds():void
{
stopAllLoopedSoundEffects();
stopMusic();
}
private function onCurrentSongReachedEnd( e:Event ):void
{
dispatchEvent( new BasicSoundEvent( BasicSoundEvent.SONG_PLAYED_COMPLETE ) );
}
public function toggleMuteMusic():void
{
if (!_isMusicMuted)
{
muteMusic();
}
else
{
unMuteMusic();
}
}
public function toggleMuteEffects():void
{
if (!_isEffectsMuted)
{
muteEffects();
}
else
{
unmuteEffects();
}
}
public function muteAll():void
{
_isMuted = true;
_globalSavedVolume = _globalSoundTransform.volume;
_globalSoundTransform.volume = 0;
applyGlobalSoundTransform();
}
public function unMuteAll():void
{
_isMuted = false;
_globalSoundTransform.volume = _globalSavedVolume;
applyGlobalSoundTransform();
}
public function muteMusic():void
{
_isMusicMuted = true;
_musicSavedVolume = _musicTransform.volume;
_musicTransform.volume = 0;
applyMusicSoundTransform();
}
public function unMuteMusic():void
{
_isMusicMuted = false;
_musicTransform.volume = _musicSavedVolume;
applyMusicSoundTransform();
}
public function muteEffects():void
{
_isEffectsMuted = true;
_effectsSavedVolume = _effectsTransform.volume;
_effectsTransform.volume = 0;
}
public function unmuteEffects():void
{
_isEffectsMuted = false;
_effectsTransform.volume = _effectsSavedVolume;
}
private function applyGlobalSoundTransform():void
{
SoundMixer.soundTransform = _globalSoundTransform;
}
private function applyMusicSoundTransform():void
{
if (_currentSongChannel != null)
{
_currentSongChannel.soundTransform = _musicTransform;
}
}
protected function get env():IEnvironmentGlobals
{
return EnvGlobalsHandler.globals;
}
}
}
Thanks!
