Skip to main content
Participating Frequently
August 27, 2013
Question

AIR on Android ANR at android.media.AudioTrack crash logs

  • August 27, 2013
  • 1 reply
  • 1748 views

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!

This topic has been closed for replies.

1 reply

chris.campbell
Legend
August 27, 2013

Could you please open a new bug report on this over at https://bugbase.adobe.com?  When adding the bug, please include your sample code or a sample application so we can quickly test this out internally.

Once added, please post back with the URL so that others affected can add their comments and votes and I can start our internal investigation.

Thanks,

Chris

mechlaAuthor
Participating Frequently
August 28, 2013