I am using a thread which records the audio using AudioRecord class and placed in recorderBUffer (which is a linked list of Short[]) , a separate thread which does the encoding of this data and place it to a playerBuffer(linked list[]). For playing the Audio I am using AudioTrack class and onPeriodicNotification() I read the data from playerBuffer and write it to track.
我使用的线程使用AudioRecord类来记录音频,并将其放入recorderBUffer(它是一个短[]的链表),这是一个单独的线程,它对数据进行编码并将其放置到playerBuffer(链表[])中。为了播放音频,我使用了AudioTrack类和onPeriodicNotification(),我从playerBuffer读取数据并将其写入跟踪。
The code is simple and straight forwards as it appears. However it doesnt work the way it should. GC_CONCURRENT eats of all the time and which is causing AudioTrack restart so frequently(I guess!). I get following messages from LogCat:-
代码看起来很简单,而且直接向前。然而,它并没有按照应有的方式运作。GC_CONCURRENT总是会有损失,这也导致了音频轨道的频繁重启(我猜!)我从LogCat得到以下信息:-
04-09 12:25:13.757: E/Constructor(10100): inside constructor
04-09 12:25:13.757: I/ApplicationPackageManager(10100): cscCountry is not German : INS
04-09 12:25:17.429: E/startRecording(10100): start Recording
04-09 12:25:17.445: I/AudioCapturer(10100): Audio Recorder created
04-09 12:25:17.546: I/Audio Player(10100): Audio Track instance created buffer Size : 2972
04-09 12:25:17.546: I/SpeexThread(10100): Thread Started Successfully..
04-09 12:25:17.734: D/dalvikvm(10100): GC_CONCURRENT freed 55K, 44% free 3208K/5639K, external 408K/517K, paused 4ms+6ms
04-09 12:25:17.945: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 39% free 3765K/6151K, external 408K/517K, paused 3ms+8ms
04-09 12:25:18.148: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 36% free 4277K/6663K, external 408K/517K, paused 3ms+8ms
04-09 12:25:18.414: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 33% free 4981K/7367K, external 408K/517K, paused 3ms+9ms
04-09 12:25:18.734: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 29% free 5877K/8263K, external 408K/517K, paused 3ms+9ms
04-09 12:25:18.828: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:19.164: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 26% free 7093K/9479K, external 408K/517K, paused 3ms+9ms
04-09 12:25:19.710: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 22% free 8693K/11079K, external 408K/517K, paused 3ms+9ms
04-09 12:25:19.984: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:20.414: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 19% free 10741K/13127K, external 408K/517K, paused 3ms+9ms
04-09 12:25:21.156: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:21.171: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 16% free 12789K/15175K, external 408K/517K, paused 3ms+11ms
04-09 12:25:21.976: D/dalvikvm(10100): GC_CONCURRENT freed <1K, 14% free 14837K/17223K, external 408K/517K, paused 3ms+9ms
// same messages errors continue
04-09 12:25:28.117: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:29.242: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 8% free 29172K/31559K, external 408K/517K, paused 3ms+11ms
04-09 12:25:29.273: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:30.445: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:30.507: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 8% free 31220K/33607K, external 408K/517K, paused 4ms+12ms
04-09 12:25:31.601: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:31.820: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 7% free 33268K/35655K, external 408K/517K, paused 3ms+12ms
04-09 12:25:32.757: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:33.187: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 7% free 35316K/37703K, external 408K/517K, paused 3ms+13ms
04-09 12:25:33.929: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:34.593: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 7% free 37364K/39751K, external 408K/517K, paused 4ms+11ms
04-09 12:25:35.085: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:36.039: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 6% free 39412K/41799K, external 408K/517K, paused 3ms+12ms
04-09 12:25:36.242: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:37.406: W/AudioTrack(10100): obtainBuffer() track 0x1d0478 disabled, restarting
04-09 12:25:37.617: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 6% free 41460K/43847K, external 408K/517K, paused 5ms+13ms
04-09 12:25:38.640: D/dalvikvm(10100): GC_FOR_MALLOC freed 1K, 6% free 43507K/45895K, external 408K/517K, paused 933ms
04-09 12:25:38.656: I/SpeexThread(10100): exitting Thread
04-09 12:25:38.656: E/stopRecording(10100): stop Recording
The AudiTrack is restarted every few miliseconds, and GArbage Collection is called almost continuously. How can I minimize GArbage Colloection calls and what is the reason behind AudioTrack restart ? Plz Help...
AudiTrack每隔几毫秒重新启动一次,并且几乎连续地调用垃圾收集。如何最小化垃圾胶接调用?音轨重启的原因是什么?请帮助……
1 个解决方案
#1
11
A temporaral solution of the problem was by increasing the HeapSize using dalvik.system.VMRuntime.getRuntime().setMinimumHeapSize(32 * 1024 * 1024);
However this approach is not recommended and should be avoided.
问题的临时解决方案是使用dalvik.system.VMRuntime.getRuntime()增加堆大小。setMinimumHeapSize(32 * 1024 * 1024);但是,不建议采用这种方法,应该避免使用这种方法。
By Extensive debugging I found that the real problem was due to overlapped interfaces and some leaky functions. Later I removed one of the Interface, redesigned the overall solution and re-factored the code and that solved my problem.
通过广泛的调试,我发现真正的问题是由于接口重叠和一些泄漏的函数。后来我删除了一个接口,重新设计了整个解决方案,重构了代码,这就解决了我的问题。
Please share if you have some other Solution,
如果你有其他的解决办法,请分享。
#1
11
A temporaral solution of the problem was by increasing the HeapSize using dalvik.system.VMRuntime.getRuntime().setMinimumHeapSize(32 * 1024 * 1024);
However this approach is not recommended and should be avoided.
问题的临时解决方案是使用dalvik.system.VMRuntime.getRuntime()增加堆大小。setMinimumHeapSize(32 * 1024 * 1024);但是,不建议采用这种方法,应该避免使用这种方法。
By Extensive debugging I found that the real problem was due to overlapped interfaces and some leaky functions. Later I removed one of the Interface, redesigned the overall solution and re-factored the code and that solved my problem.
通过广泛的调试,我发现真正的问题是由于接口重叠和一些泄漏的函数。后来我删除了一个接口,重新设计了整个解决方案,重构了代码,这就解决了我的问题。
Please share if you have some other Solution,
如果你有其他的解决办法,请分享。