Closed Bug 1079810 Opened 10 years ago Closed 10 years ago

Empty sound writes into speaker, cause serious power consumption

Categories

(Firefox OS Graveyard :: Gaia::Dialer, defect)

ARM
Gonk (Firefox OS)
defect
Not set
normal

Tracking

(blocking-b2g:2.1+, b2g-v2.0 unaffected, b2g-v2.1 verified, b2g-v2.2 verified)

VERIFIED FIXED
2.1 S7 (24Oct)
blocking-b2g 2.1+
Tracking Status
b2g-v2.0 --- unaffected
b2g-v2.1 --- verified
b2g-v2.2 --- verified

People

(Reporter: shawnjohnjr, Assigned: drs)

References

Details

(Whiteboard: [caf priority: p2][CR 741215])

Attachments

(4 files, 4 obsolete files)

Empty sound writes into speaker. So if you hear carefully, speaker turned on.
If you connect with a2dp speaker, empty sound will write into a2dp speaker.

Gecko:c00a1604ca43cf8a2061d28101aab482760b2745
Gaia:a6c29cc2f048dc08a2f008322699368b7e5cd9b0
blocking-b2g: --- → 2.2?
OS: Linux → Gonk (Firefox OS)
Hardware: x86_64 → ARM
Even without connecting with a2dp speaker, you can hear "speaker" on the phone turns on. We really need to know which component did this.
I just found this also happened on current v2.1 now.
[Blocking Requested - why for this release]:
blocking-b2g: 2.2? → 2.1?
Summary: Empty sound writes into speaker → Empty sound writes into speaker, cause serious power consumption
[Blocking Requested - why for this release]:
1. Silent sound will be played all the time, even though no one is actually playing any sound
2. Power consumption is very high because speaker never turned off
It looks like upper layers continuously write audio data.
Found an audio track is keep playing. 
Outputs dump:
- Output 2 dump:
 Sampling rate: 48000
 Format: 00000001
 Channels: 00000003
 Latency: 80
 Flags 00000002
 Devices 00000002
 Stream volume refCount muteCount
 00     1.000     00       00
 01     0.501     01       00  <----------
 02     1.000     00       00
 03     1.000     00       00
 04     1.000     00       00
 05     1.000     00       00
 06     -1.000     00       00
 07     0.501     00       00
 08     0.000     00       00
 09     0.000     00       00
 10     0.000     00       00
I just have a test on gecko master at flame device.
This version is ok
  commit 79093724dce744f5ddc5234621607b1f14f7500c
  Author: William Chen <wchen@mozilla.com>
  Date:   Tue Aug 26 20:19:56 2014 -0700

    Bug 887541 - Implement web components event path and event retargeting. r=smaug

But fail on 

commit e6fa29bd01f85eb8a4a69d573f81fb4e7cb568c3
Author: Randell Jesup <rjesup@jesup.org>
Date:   Tue Aug 26 17:12:41 2014 +0200

    Bug 848954 - Part 32 - Disable MSG sleep. r=padenot
    
    This has a race somewhere, so we disable it for now.
    
    The real fix will come from the Web Audio API Suspend API [0]


You can check by running this command
>> adb shell dumpsys media.audio_policy
and check the section:
===
 Sampling rate: 44100
 Format: 1
 Channels: 00000003
 Latency: 96
 Flags 00000002
 Devices 00000002
 Stream volume refCount muteCount
 00     1.000     00       00
 01     0.501     01       00   <----normally, it should 0
 02     1.000     00       00
 03     1.000     00       00
 04     1.000     00       00
 05     1.000     00       00
 06     -1.000     00       00
 07     0.501     00       00
 08     0.000     00       00
 09     0.000     00       00
 10     1.000     00       00

====
Hi Paul,
Any idea about this?
Flags: needinfo?(padenot)
During boot-up, 
Try to set Breakpoint on b2g at boot-up stage (The device does not enter the home screen): 

, opensl_stream_init (ctx=0xadc88d00, stream=0xad49bdc4, stream_name=0xb6243a4b "AudioCallbackDriver", stream_params=<optimized out>, latency=42, data_callback=
    0xb5732fd9 <mozilla::AudioCallbackDriver::DataCallback_s(cubeb_stream*, void*, void*, long)>, state_callback=0xb572b74f <mozilla::AudioCallbackDriver::StateCallback_s(cubeb_stream*, void*, cubeb_state)>, 
    user_ptr=0xad6ba800) at ../../../../gecko/media/libcubeb/src/cubeb_opensl.c:464
464	{
(gdb) bt
#0  opensl_stream_init (ctx=0xadc88d00, stream=0xad49bdc4, stream_name=0xb6243a4b "AudioCallbackDriver", stream_params=<optimized out>, latency=42, 
    data_callback=0xb5732fd9 <mozilla::AudioCallbackDriver::DataCallback_s(cubeb_stream*, void*, void*, long)>, 
    state_callback=0xb572b74f <mozilla::AudioCallbackDriver::StateCallback_s(cubeb_stream*, void*, cubeb_state)>, user_ptr=0xad6ba800) at ../../../../gecko/media/libcubeb/src/cubeb_opensl.c:464
#1  0xb5b69926 in cubeb_stream_init (context=0xadc88d00, stream=0xad49bdc4, stream_name=0xb6243a4b "AudioCallbackDriver", stream_params=..., latency=42, 
    data_callback=0xb5732fd9 <mozilla::AudioCallbackDriver::DataCallback_s(cubeb_stream*, void*, void*, long)>, 
    state_callback=0xb572b74f <mozilla::AudioCallbackDriver::StateCallback_s(cubeb_stream*, void*, cubeb_state)>, user_ptr=0xad6ba800) at ../../../../gecko/media/libcubeb/src/cubeb.c:205
#2  0xb57307d6 in mozilla::AudioCallbackDriver::Init (this=0xad6ba800) at ../../../gecko/content/media/GraphDriver.cpp:520
#3  0xb5730840 in mozilla::AsyncCubebTask::Run (this=0xad633960) at ../../../gecko/content/media/GraphDriver.cpp:433
#4  0xb4e50932 in ProcessNextEvent (aResult=0xad49be57, aMayWait=<optimized out>, this=0xad6486d0) at ../../../gecko/xpcom/threads/nsThread.cpp:769
#5  nsThread::ProcessNextEvent (this=0xad6486d0, aMayWait=<optimized out>, aResult=0xad49be57) at ../../../gecko/xpcom/threads/nsThread.cpp:684
#6  0xb4e5ebe6 in NS_ProcessNextEvent (aThread=<optimized out>, aMayWait=<optimized out>) at /home/randy-lin/b2g-flame/gecko/xpcom/glue/nsThreadUtils.cpp:265
#7  0xb4f9a874 in mozilla::ipc::MessagePumpForNonMainThreads::Run (this=0xad6fd1f0, aDelegate=0xad6e2440) at ../../../gecko/ipc/glue/MessagePump.cpp:326
#8  0xb4f8f47e in MessageLoop::RunInternal (this=<optimized out>) at ../../../gecko/ipc/chromium/src/base/message_loop.cc:229
#9  0xb4f8f530 in RunHandler (this=0xad6e2440) at ../../../gecko/ipc/chromium/src/base/message_loop.cc:222
#10 MessageLoop::Run (this=0xad6e2440) at ../../../gecko/ipc/chromium/src/base/message_loop.cc:196
#11 0xb4e53998 in nsThread::ThreadFunc (aArg=0xad6486d0) at ../../../gecko/xpcom/threads/nsThread.cpp:345
#12 0xb69a56a2 in _pt_root (arg=0xb0eb9980) at ../../../../../gecko/nsprpub/pr/src/pthreads/ptthread.c:212
#13 0xb6e70ba4 in __thread_entry (func=0xb69a5609 <_pt_root>, arg=0xb0eb9980, tls=0xad49bf00) at bionic/libc/bionic/pthread_create.cpp:92
#14 0xb6e70d20 in pthread_create (thread_out=0xbed5d5b4, attr=<optimized out>, start_routine=0x78, arg=0xb0eb9980) at bionic/libc/bionic/pthread_create.cpp:201
#15 0xad60cf50 in ?? ()
#16 0xad60cf50 in ?? ()

I also set break point on opensl_destroy(cubeb * ctx) and it doesn't hit this line.
Regression window was found,  clear the whiteboard tag.
Component: AudioChannel → Video/Audio
Product: Firefox OS → Core
Someone is creating an AudioContext at boot time again, and should not. Break on mozilla::AudioContext::AudioContext and `call DumpJSStack()` to check what is causing this.

Note that there is a spec proposal [0] to add `suspend` and `resume` methods to the AudioContext, that will allow us to solve those issues in a nicer way, but it's not stable yet.

[0]: https://github.com/WebAudio/web-audio-api/issues/317
Flags: needinfo?(padenot)
See Also: → 1077292
Shawn, does this happen on 2.0?  Trying to see if this is a recent regression or not against 2.0.
Flags: needinfo?(shuang)
blocking-b2g: 2.1? → 2.1+
Thanks Paul!
Find this js callstack:

Breakpoint 1, mozilla::dom::AudioContext::AudioContext (this=0xb0354fb0, aWindow=0xaf89f910, aIsOffline=<optimized out>, aChannel=mozilla::dom::Normal, aNumberOfChannels=0, aLength=0, aSampleRate=0)
    at /home/randy-lin/b2g-flame/gecko/content/media/webaudio/AudioContext.cpp:94
94	printf("AudioContext::AudioContext\n");
(gdb) call DumpJSStack()
0 tp_ensureAudio() ["app://callscreen.gaiamobile.org/gaia_build_defer_index.js":81]
    this = [object Object]
1 tp_setChannel(channel = "normal") ["app://callscreen.gaiamobile.org/gaia_build_defer_index.js":92]
    this = [object Object]
2 tp_init(channel = "normal") ["app://callscreen.gaiamobile.org/gaia_build_defer_index.js":80]
    this = [object Object]
3 kh_init(oncall = true) ["app://callscreen.gaiamobile.org/gaia_build_defer_index.js":99]
    this = [object Object]
4 callSetup(evt = [object Event]) ["app://callscreen.gaiamobile.org/gaia_build_defer_index.js":10]
    this = [object Window]
Randy, will you take this bug?
Flags: needinfo?(rlin)
Tony,
I've tried v2.0, I did not see the same problem.
Flags: needinfo?(shuang)
Hi Ken, 
Form c10 & c12 information, I won't take this.
I think gecko side won't have patch for this issue.
Flags: needinfo?(rlin)
It looks like callscreen callSetup had been called especially after powering on!
ni Etienne, it seems system app preloaded callscreen and cause AudioContext open.
Flags: needinfo?(etienne)
Blocks: 1077292
See Also: 1077292
(In reply to Shawn Huang [:shawnjohnjr] from comment #17)
> ni Etienne, it seems system app preloaded callscreen and cause AudioContext
> open.

Not since bug 1061012 landed. (2.1 is marked fixed)
Flags: needinfo?(etienne)
Please find the logcat.txt, and search keyword "callsetup". This logcat has been captured from boot-up.

I've added log in apps/callscreen/js/index.js.
 window.addEventListener('load', function callSetup(evt) {
   window.removeEventListener('load', callSetup);
-
+  dump('--------------------callsetup----------------------------');
   CallsHandler.setup();
   AudioCompetingHelper.init('callscreen');
   CallScreen.init();
Flags: needinfo?(etienne)
I'm pretty sure this is related to callscreen had been loaded during boot up. Etienne, can you confirm again?
Component: Video/Audio → Gaia::Dialer
Product: Core → Firefox OS
According to comment 20. If I am wrong, please change it back.
Assignee: nobody → drs.bugzilla
Target Milestone: --- → 2.1 S7 (24Oct)
(In reply to Randy Lin [:rlin] from comment #6)
> I just have a test on gecko master at flame device.
> This version is ok
>   commit 79093724dce744f5ddc5234621607b1f14f7500c
>   Author: William Chen <wchen@mozilla.com>
>   Date:   Tue Aug 26 20:19:56 2014 -0700
> 
>     Bug 887541 - Implement web components event path and event retargeting.
> r=smaug
> 
> But fail on 
> 
> commit e6fa29bd01f85eb8a4a69d573f81fb4e7cb568c3
> Author: Randell Jesup <rjesup@jesup.org>
> Date:   Tue Aug 26 17:12:41 2014 +0200
> 
>     Bug 848954 - Part 32 - Disable MSG sleep. r=padenot
>     
>     This has a race somewhere, so we disable it for now.
>     
>     The real fix will come from the Web Audio API Suspend API [0]
> 
> 
> You can check by running this command
> >> adb shell dumpsys media.audio_policy
> and check the section:
> ===
>  Sampling rate: 44100
>  Format: 1
>  Channels: 00000003
>  Latency: 96
>  Flags 00000002
>  Devices 00000002
>  Stream volume refCount muteCount
>  00     1.000     00       00
>  01     0.501     01       00   <----normally, it should 0
>  02     1.000     00       00
>  03     1.000     00       00
>  04     1.000     00       00
>  05     1.000     00       00
>  06     -1.000     00       00
>  07     0.501     00       00
>  08     0.000     00       00
>  09     0.000     00       00
>  10     1.000     00       00
> 
> ====

I checked into this. For starters, I'm not able to repro getting a refCount of 1 for any stream on bootup. However, when I open the Dialer, I then have a refCount of 1 until I kill it. Closing it is not enough.

The only place where an AudioContext is created during the lifetime of the Dialer app is here:
https://github.com/mozilla-b2g/gaia/blob/master/shared/js/dialer/tone_player.js#L33

When I close the Dialer app, I verified that all references to this AudioContext are released. So there should be a refCount of 0, but it stays at 1.

Randell, Paul, do you know what could be going on here?
Flags: needinfo?(rjesup)
Flags: needinfo?(padenot)
Can you take a memory report?  It might show us what is holding it alive.
Flags: needinfo?(drs.bugzilla)
Of note:
11.78 MB (100.0%) -- explicit
├───4.69 MB (39.77%) -- js-non-window
│   ├──0.00 MB (00.01%) -- webaudio
│   │  ├──0.00 MB (00.00%) -- audio-node/AudioDestinationNode
│   │  │  ├──0.00 MB (00.00%) ── stream-objects
│   │  │  ├──0.00 MB (00.00%) ── dom-nodes
│   │  │  └──0.00 MB (00.00%) ── engine-objects
│   │  └──0.00 MB (00.00%) ── audiocontext
Flags: needinfo?(drs.bugzilla)
11.78 MB (100.0%) -- explicit
├───4.69 MB (39.77%) -- js-non-window
│   ├──0.00 MB (00.02%) -- webaudio
│   │  ├──0.00 MB (00.01%) -- audio-node/AudioDestinationNode
│   │  │  ├──0.00 MB (00.01%) ── stream-objects [2]
│   │  │  ├──0.00 MB (00.00%) ── dom-nodes [2]
│   │  │  └──0.00 MB (00.00%) ── engine-objects [2]
│   │  └──0.00 MB (00.00%) ── audiocontext [2]

These look more or less identical to me. Should I attach the full report generated by tools/get_about_memory.py?
Though if the [2] is the amount of references to that object, it might explain this.
No, it's not.  Can you attach the entire directory?  I'm interested in the CC logs.
Attachment #8508439 - Attachment is obsolete: true
Attachment #8508441 - Attachment is obsolete: true
The only thing I see holding alive the AudioContexts in the background log is devtools stuff ...

Found and displayed 6 paths.
Parsing gc-edges.1750.log. Done loading graph. Reversing graph. Done.
via PersistentRooted<JSObject *> :[FakeBackstagePass] --[ActorPool]--> [Proxy] --[private]--> [Function ActorPool] --[prototype]--> [Object] --[cleanup]--> [Function AP_cleanup] --[fun_environment]--> [Call] --[enclosing_environment]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[loader]--> [Object] --[value]--> [Object] --[lazyRequireGetter]--> [Function loaderGlobals.loader.lazyRequireGetter] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [FakeBackstagePass] --[DevToolsLoader]--> [Function DevToolsLoader] --[prototype]--> [Object] --[require]--> [Function DevToolsLoader.prototype.require] --[fun_environment]--> [Call] --[loaderModules]--> [Object] --[Debugger]--> [Proxy] --[private]--> [Function Debugger] --[prototype]--> [Debugger 0] --[**UNKNOWN SLOT 0**]--> [Frame 0] --[shape]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function .get] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[module]--> [Proxy] --[private]--> [Object] --[exports]--> [Object] --[ChromeDebuggerActor]--> [Proxy] --[private]--> [Function ChromeDebuggerActor] --[prototype]--> [Object] --[type]--> [type_object] --[type_proto]--> [Object] --[_clearSteppingHooks]--> [Function ThreadActor.prototype._clearSteppingHooks] --[fun_environment]--> [Call] --[DebuggerServer]--> [Object] --[addBrowserActors]--> [Function DebuggerServer.addBrowserActors] --[fun_environment]--> [Call] --[ChildDebuggerTransport]--> [Function ChildDebuggerTransport] --[prototype]--> [Object] --[close]--> [Function ChildDebuggerTransport.prototype.close] --[fun_environment]--> [Call] --[JSONPacket]--> [Function JSONPacket] --[shape]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[require]--> [Proxy] --[private]--> [Function require] --[resolve]--> [Function resolve] --[fun_environment]--> [Call] --[loader]--> [Object] --[sandboxes]--> [Object] --[resource://gre/modules/commonjs/sdk/util/object.js]--> [Proxy] --[private]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[exports]--> [Object] --[value]--> [Object] --[extend]--> [Proxy] --[private]--> [Function extend] --[fun_environment]--> [Call] --[flatten]--> [Function flatten] --[fun_environment]--> [Call] --[enclosing_environment]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[require]--> [Object] --[value]--> [Function require] --[fun_environment]--> [Call] --[modules]--> [Object] --[resource://gre/modules/commonjs/sdk/event/core.js]--> [Object] --[exports]--> [Object] --[count]--> [Proxy] --[private]--> [Function count] --[fun_environment]--> [Call] --[event]--> [Function namespace] --[fun_environment]--> [Call] --[map]--> [WeakMap b12e5190] --[WeakMap entry value]--> [Object] --[changed-toplevel-document]--> [Array] --[objectElements[0]]--> [Function WCA__onChangedToplevelDocument] --[**UNKNOWN SLOT 0**]--> [Object] --[registeredPool]--> [Object] --[_actors]--> [Object] --[conn0.child20/callWatcherActor4]--> [Object] --[_parentActor]--> [Object] --[_tabPool]--> [Object] --[conn]--> [Object] --[_extraPools]--> [Array] --[objectElements[4]]--> [Object] --[_actors]--> [Object] --[conn0.child20/obj30]--> [Object] --[obj]--> [Proxy] --[private]--> [Object b3c73340] --[**UNKNOWN SLOT 0**]--> [Debugger b135a400] --[WeakMap entry key]--> [AudioContext]
via PersistentRooted<JSObject *> :[FakeBackstagePass] --[DevToolsLoader]--> [Function DevToolsLoader] --[prototype]--> [Object] --[require]--> [Function DevToolsLoader.prototype.require] --[fun_environment]--> [Call] --[loaderModules]--> [Object] --[Debugger]--> [Proxy] --[private]--> [Function Debugger] --[prototype]--> [Debugger 0] --[**UNKNOWN SLOT 0**]--> [Frame 0] --[shape]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function .get] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[module]--> [Proxy] --[private]--> [Object] --[exports]--> [Object] --[ChromeDebuggerActor]--> [Proxy] --[private]--> [Function ChromeDebuggerActor] --[prototype]--> [Object] --[type]--> [type_object] --[type_proto]--> [Object] --[_clearSteppingHooks]--> [Function ThreadActor.prototype._clearSteppingHooks] --[fun_environment]--> [Call] --[DebuggerServer]--> [Object] --[addBrowserActors]--> [Function DebuggerServer.addBrowserActors] --[fun_environment]--> [Call] --[ChildDebuggerTransport]--> [Function ChildDebuggerTransport] --[prototype]--> [Object] --[close]--> [Function ChildDebuggerTransport.prototype.close] --[fun_environment]--> [Call] --[JSONPacket]--> [Function JSONPacket] --[shape]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[require]--> [Proxy] --[private]--> [Function require] --[resolve]--> [Function resolve] --[fun_environment]--> [Call] --[loader]--> [Object] --[sandboxes]--> [Object] --[resource://gre/modules/commonjs/sdk/util/object.js]--> [Proxy] --[private]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[exports]--> [Object] --[value]--> [Object] --[extend]--> [Proxy] --[private]--> [Function extend] --[fun_environment]--> [Call] --[flatten]--> [Function flatten] --[fun_environment]--> [Call] --[enclosing_environment]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[require]--> [Object] --[value]--> [Function require] --[fun_environment]--> [Call] --[modules]--> [Object] --[resource://gre/modules/commonjs/sdk/event/core.js]--> [Object] --[exports]--> [Object] --[count]--> [Proxy] --[private]--> [Function count] --[fun_environment]--> [Call] --[event]--> [Function namespace] --[fun_environment]--> [Call] --[map]--> [WeakMap b12e5190] --[WeakMap entry value]--> [Object] --[changed-toplevel-document]--> [Array] --[objectElements[0]]--> [Function WCA__onChangedToplevelDocument] --[**UNKNOWN SLOT 0**]--> [Object] --[registeredPool]--> [Object] --[_actors]--> [Object] --[conn0.child20/callWatcherActor4]--> [Object] --[_parentActor]--> [Object] --[_tabPool]--> [Object] --[conn]--> [Object] --[_extraPools]--> [Array] --[objectElements[4]]--> [Object] --[_actors]--> [Object] --[conn0.child20/obj30]--> [Object] --[obj]--> [Proxy] --[private]--> [Object b3c73340] --[**UNKNOWN SLOT 0**]--> [Debugger b135a400] --[WeakMap entry key]--> [AudioContext]
via PersistentRooted<JSObject *> :[FakeBackstagePass] --[DevToolsUtils]--> [Object] --[dumpn]--> [Proxy] --[private]--> [Function dumpn] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[loader]--> [Object] --[value]--> [Object] --[lazyRequireGetter]--> [Function loaderGlobals.loader.lazyRequireGetter] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [FakeBackstagePass] --[DevToolsLoader]--> [Function DevToolsLoader] --[prototype]--> [Object] --[require]--> [Function DevToolsLoader.prototype.require] --[fun_environment]--> [Call] --[loaderModules]--> [Object] --[Debugger]--> [Proxy] --[private]--> [Function Debugger] --[prototype]--> [Debugger 0] --[**UNKNOWN SLOT 0**]--> [Frame 0] --[shape]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function .get] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[module]--> [Proxy] --[private]--> [Object] --[exports]--> [Object] --[ChromeDebuggerActor]--> [Proxy] --[private]--> [Function ChromeDebuggerActor] --[prototype]--> [Object] --[type]--> [type_object] --[type_proto]--> [Object] --[_clearSteppingHooks]--> [Function ThreadActor.prototype._clearSteppingHooks] --[fun_environment]--> [Call] --[DebuggerServer]--> [Object] --[addBrowserActors]--> [Function DebuggerServer.addBrowserActors] --[fun_environment]--> [Call] --[ChildDebuggerTransport]--> [Function ChildDebuggerTransport] --[prototype]--> [Object] --[close]--> [Function ChildDebuggerTransport.prototype.close] --[fun_environment]--> [Call] --[JSONPacket]--> [Function JSONPacket] --[shape]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[require]--> [Proxy] --[private]--> [Function require] --[resolve]--> [Function resolve] --[fun_environment]--> [Call] --[loader]--> [Object] --[sandboxes]--> [Object] --[resource://gre/modules/commonjs/sdk/util/object.js]--> [Proxy] --[private]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[exports]--> [Object] --[value]--> [Object] --[extend]--> [Proxy] --[private]--> [Function extend] --[fun_environment]--> [Call] --[flatten]--> [Function flatten] --[fun_environment]--> [Call] --[enclosing_environment]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[require]--> [Object] --[value]--> [Function require] --[fun_environment]--> [Call] --[modules]--> [Object] --[resource://gre/modules/commonjs/sdk/event/core.js]--> [Object] --[exports]--> [Object] --[count]--> [Proxy] --[private]--> [Function count] --[fun_environment]--> [Call] --[event]--> [Function namespace] --[fun_environment]--> [Call] --[map]--> [WeakMap b12e5190] --[WeakMap entry value]--> [Object] --[changed-toplevel-document]--> [Array] --[objectElements[0]]--> [Function WCA__onChangedToplevelDocument] --[**UNKNOWN SLOT 0**]--> [Object] --[registeredPool]--> [Object] --[_actors]--> [Object] --[conn0.child20/callWatcherActor4]--> [Object] --[_parentActor]--> [Object] --[_tabPool]--> [Object] --[conn]--> [Object] --[_extraPools]--> [Array] --[objectElements[4]]--> [Object] --[_actors]--> [Object] --[conn0.child20/obj30]--> [Object] --[obj]--> [Proxy] --[private]--> [Object b3c73340] --[**UNKNOWN SLOT 0**]--> [Debugger b135a400] --[WeakMap entry key]--> [AudioContext]
via PersistentRooted<JSScript *> :[script resource://gre/modules/devtools/DevToolsUti] --[function]--> [Function] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [FakeBackstagePass] --[DevToolsUtils]--> [Object] --[dumpn]--> [Proxy] --[private]--> [Function dumpn] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[loader]--> [Object] --[value]--> [Object] --[lazyRequireGetter]--> [Function loaderGlobals.loader.lazyRequireGetter] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [FakeBackstagePass] --[DevToolsLoader]--> [Function DevToolsLoader] --[prototype]--> [Object] --[require]--> [Function DevToolsLoader.prototype.require] --[fun_environment]--> [Call] --[loaderModules]--> [Object] --[Debugger]--> [Proxy] --[private]--> [Function Debugger] --[prototype]--> [Debugger 0] --[**UNKNOWN SLOT 0**]--> [Frame 0] --[shape]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function .get] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[module]--> [Proxy] --[private]--> [Object] --[exports]--> [Object] --[ChromeDebuggerActor]--> [Proxy] --[private]--> [Function ChromeDebuggerActor] --[prototype]--> [Object] --[type]--> [type_object] --[type_proto]--> [Object] --[_clearSteppingHooks]--> [Function ThreadActor.prototype._clearSteppingHooks] --[fun_environment]--> [Call] --[DebuggerServer]--> [Object] --[addBrowserActors]--> [Function DebuggerServer.addBrowserActors] --[fun_environment]--> [Call] --[ChildDebuggerTransport]--> [Function ChildDebuggerTransport] --[prototype]--> [Object] --[close]--> [Function ChildDebuggerTransport.prototype.close] --[fun_environment]--> [Call] --[JSONPacket]--> [Function JSONPacket] --[shape]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[require]--> [Proxy] --[private]--> [Function require] --[resolve]--> [Function resolve] --[fun_environment]--> [Call] --[loader]--> [Object] --[sandboxes]--> [Object] --[resource://gre/modules/commonjs/sdk/util/object.js]--> [Proxy] --[private]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[exports]--> [Object] --[value]--> [Object] --[extend]--> [Proxy] --[private]--> [Function extend] --[fun_environment]--> [Call] --[flatten]--> [Function flatten] --[fun_environment]--> [Call] --[enclosing_environment]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[require]--> [Object] --[value]--> [Function require] --[fun_environment]--> [Call] --[modules]--> [Object] --[resource://gre/modules/commonjs/sdk/event/core.js]--> [Object] --[exports]--> [Object] --[count]--> [Proxy] --[private]--> [Function count] --[fun_environment]--> [Call] --[event]--> [Function namespace] --[fun_environment]--> [Call] --[map]--> [WeakMap b12e5190] --[WeakMap entry value]--> [Object] --[changed-toplevel-document]--> [Array] --[objectElements[0]]--> [Function WCA__onChangedToplevelDocument] --[**UNKNOWN SLOT 0**]--> [Object] --[registeredPool]--> [Object] --[_actors]--> [Object] --[conn0.child20/callWatcherActor4]--> [Object] --[_parentActor]--> [Object] --[_tabPool]--> [Object] --[conn]--> [Object] --[_extraPools]--> [Array] --[objectElements[4]]--> [Object] --[_actors]--> [Object] --[conn0.child20/obj30]--> [Object] --[obj]--> [Proxy] --[private]--> [Object b3c73340] --[**UNKNOWN SLOT 0**]--> [Debugger b135a400] --[WeakMap entry key]--> [AudioContext]
via PersistentRooted<JSScript *> :[script resource://gre/modules/devtools/Loader.jsm:] --[objects[7]]--> [Block] --[enclosing_environment]--> [Function] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [FakeBackstagePass] --[DevToolsLoader]--> [Function DevToolsLoader] --[prototype]--> [Object] --[require]--> [Function DevToolsLoader.prototype.require] --[fun_environment]--> [Call] --[loaderModules]--> [Object] --[Debugger]--> [Proxy] --[private]--> [Function Debugger] --[prototype]--> [Debugger 0] --[**UNKNOWN SLOT 0**]--> [Frame 0] --[shape]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function .get] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[module]--> [Proxy] --[private]--> [Object] --[exports]--> [Object] --[ChromeDebuggerActor]--> [Proxy] --[private]--> [Function ChromeDebuggerActor] --[prototype]--> [Object] --[type]--> [type_object] --[type_proto]--> [Object] --[_clearSteppingHooks]--> [Function ThreadActor.prototype._clearSteppingHooks] --[fun_environment]--> [Call] --[DebuggerServer]--> [Object] --[addBrowserActors]--> [Function DebuggerServer.addBrowserActors] --[fun_environment]--> [Call] --[ChildDebuggerTransport]--> [Function ChildDebuggerTransport] --[prototype]--> [Object] --[close]--> [Function ChildDebuggerTransport.prototype.close] --[fun_environment]--> [Call] --[JSONPacket]--> [Function JSONPacket] --[shape]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[require]--> [Proxy] --[private]--> [Function require] --[resolve]--> [Function resolve] --[fun_environment]--> [Call] --[loader]--> [Object] --[sandboxes]--> [Object] --[resource://gre/modules/commonjs/sdk/util/object.js]--> [Proxy] --[private]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[exports]--> [Object] --[value]--> [Object] --[extend]--> [Proxy] --[private]--> [Function extend] --[fun_environment]--> [Call] --[flatten]--> [Function flatten] --[fun_environment]--> [Call] --[enclosing_environment]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[require]--> [Object] --[value]--> [Function require] --[fun_environment]--> [Call] --[modules]--> [Object] --[resource://gre/modules/commonjs/sdk/event/core.js]--> [Object] --[exports]--> [Object] --[count]--> [Proxy] --[private]--> [Function count] --[fun_environment]--> [Call] --[event]--> [Function namespace] --[fun_environment]--> [Call] --[map]--> [WeakMap b12e5190] --[WeakMap entry value]--> [Object] --[changed-toplevel-document]--> [Array] --[objectElements[0]]--> [Function WCA__onChangedToplevelDocument] --[**UNKNOWN SLOT 0**]--> [Object] --[registeredPool]--> [Object] --[_actors]--> [Object] --[conn0.child20/callWatcherActor4]--> [Object] --[_parentActor]--> [Object] --[_tabPool]--> [Object] --[conn]--> [Object] --[_extraPools]--> [Array] --[objectElements[4]]--> [Object] --[_actors]--> [Object] --[conn0.child20/obj30]--> [Object] --[obj]--> [Proxy] --[private]--> [Object b3c73340] --[**UNKNOWN SLOT 0**]--> [Debugger b135a400] --[WeakMap entry key]--> [AudioContext]
via PersistentRooted<JSScript *> :[script resource://gre/modules/devtools/dbg-server.] --[function]--> [Function] --[fun_environment]--> [FakeBackstagePass] --[ActorPool]--> [Proxy] --[private]--> [Function ActorPool] --[prototype]--> [Object] --[cleanup]--> [Function AP_cleanup] --[fun_environment]--> [Call] --[enclosing_environment]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[loader]--> [Object] --[value]--> [Object] --[lazyRequireGetter]--> [Function loaderGlobals.loader.lazyRequireGetter] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [FakeBackstagePass] --[DevToolsLoader]--> [Function DevToolsLoader] --[prototype]--> [Object] --[require]--> [Function DevToolsLoader.prototype.require] --[fun_environment]--> [Call] --[loaderModules]--> [Object] --[Debugger]--> [Proxy] --[private]--> [Function Debugger] --[prototype]--> [Debugger 0] --[**UNKNOWN SLOT 0**]--> [Frame 0] --[shape]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function .get] --[shape]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[module]--> [Proxy] --[private]--> [Object] --[exports]--> [Object] --[ChromeDebuggerActor]--> [Proxy] --[private]--> [Function ChromeDebuggerActor] --[prototype]--> [Object] --[type]--> [type_object] --[type_proto]--> [Object] --[_clearSteppingHooks]--> [Function ThreadActor.prototype._clearSteppingHooks] --[fun_environment]--> [Call] --[DebuggerServer]--> [Object] --[addBrowserActors]--> [Function DebuggerServer.addBrowserActors] --[fun_environment]--> [Call] --[ChildDebuggerTransport]--> [Function ChildDebuggerTransport] --[prototype]--> [Object] --[close]--> [Function ChildDebuggerTransport.prototype.close] --[fun_environment]--> [Call] --[JSONPacket]--> [Function JSONPacket] --[shape]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[parent]--> [Object] --[require]--> [Proxy] --[private]--> [Function require] --[resolve]--> [Function resolve] --[fun_environment]--> [Call] --[loader]--> [Object] --[sandboxes]--> [Object] --[resource://gre/modules/commonjs/sdk/util/object.js]--> [Proxy] --[private]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[exports]--> [Object] --[value]--> [Object] --[extend]--> [Proxy] --[private]--> [Function extend] --[fun_environment]--> [Call] --[flatten]--> [Function flatten] --[fun_environment]--> [Call] --[enclosing_environment]--> [Object] --[shape]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[parent]--> [shape] --[base]--> [base_shape] --[getter]--> [Proxy] --[private]--> [Function Loader/load/descriptors<.Components] --[fun_environment]--> [Call] --[descriptors]--> [Object] --[require]--> [Object] --[value]--> [Function require] --[fun_environment]--> [Call] --[modules]--> [Object] --[resource://gre/modules/commonjs/sdk/event/core.js]--> [Object] --[exports]--> [Object] --[count]--> [Proxy] --[private]--> [Function count] --[fun_environment]--> [Call] --[event]--> [Function namespace] --[fun_environment]--> [Call] --[map]--> [WeakMap b12e5190] --[WeakMap entry value]--> [Object] --[changed-toplevel-document]--> [Array] --[objectElements[0]]--> [Function WCA__onChangedToplevelDocument] --[**UNKNOWN SLOT 0**]--> [Object] --[registeredPool]--> [Object] --[_actors]--> [Object] --[conn0.child20/callWatcherActor4]--> [Object] --[_parentActor]--> [Object] --[_tabPool]--> [Object] --[conn]--> [Object] --[_extraPools]--> [Array] --[objectElements[4]]--> [Object] --[_actors]--> [Object] --[conn0.child20/obj30]--> [Object] --[obj]--> [Proxy] --[private]--> [Object b3c73340] --[**UNKNOWN SLOT 0**]--> [Debugger b135a400] --[WeakMap entry key]--> [AudioContext]
I guess pasting that in directly was a bad idea :/
Well, this is weird. The AudioContexts are kepts alive by the Web Audio Devtools. Are they even running ? Also, we see that they are referenced by WeakMaps (as they should if devtools are opened), so how are they kept alive ?
Flags: needinfo?(padenot)
New PR: https://github.com/mozilla-b2g/gaia/pull/25422

Actually, let's just land this on master and rebase bug 834530. From my previous patch:

(In reply to Doug Sherk (:drs) (use needinfo?) from comment #36)
> I was unable to repro the consequences of the original issue. But I was able
> to verify that we were indeed spawning an AudioContext on bootup.
Attachment #8509857 - Attachment is obsolete: true
Attachment #8509857 - Flags: review?(gsvelto)
Attachment #8509914 - Flags: review?(gsvelto)
Flags: needinfo?(etienne)
Comment on attachment 8509914 [details] [diff] [review]
Don't initialize an AudioContext on Callscreen init.

Review of attachment 8509914 [details] [diff] [review]:
-----------------------------------------------------------------

r- because this approach doesn't work correctly, see below for more detail.

::: apps/communications/dialer/test/unit/tone_player_test.js
@@ +116,5 @@
> +  suite('playSequence', function() {
> +    setup(function() {
> +      TonePlayer.init('normal');
> +
> +      this.sinon.stub(TonePlayer, 'dummySound');

The dummySound() method is gone since we removed the workarounds after bug 848954 landed. This will always make the test fail.

::: shared/js/dialer/tone_player.js
@@ +16,5 @@
>    _gainNode: null,
>    _playingNodes: [],
>  
>    init: function tp_init(channel) {
> +    this._channel = channel;

This change by itself doesn't work because in the case of the dialer for example we don't get a visibility event after initializing so when using the start() function we'll hit a null context. You might want to call ensureAudio() at the beginning of the start() function to ensure that the context is created.

@@ +21,4 @@
>    },
>  
>    ensureAudio: function tp_ensureAudio() {
> +    if (this._audioContext || !this._channel || document.hidden) {

I find this change risky: one of the callers of ensureAudio() expects it to ensure that a valid AudioContext is present. We shouldn't make that dependent on visibility and we don't need to if we properly discard the context when the app is hidden.
Attachment #8509914 - Flags: review?(gsvelto) → review-
Updated PR.

The v2.1 version is slightly different but not enough to request independent review on. The only difference is this line:
https://github.com/mozilla-b2g/gaia/pull/25458/files#diff-1cbdeb40c5b9f3a8e7db473bf91fc33fR77

I'll manually uplift this once it lands on master and gets approval.
Attachment #8509914 - Attachment is obsolete: true
Flags: needinfo?(rjesup)
Attachment #8510385 - Flags: review?(gsvelto)
Comment on attachment 8510385 [details] [diff] [review]
Don't initialize an AudioContext on Callscreen init.

Review of attachment 8510385 [details] [diff] [review]:
-----------------------------------------------------------------

LGTM with an additional unit-test, see below.

::: apps/communications/dialer/test/unit/tone_player_test.js
@@ +82,5 @@
> +
> +      assert.equal(MockAudioContext.instances.length, 1);
> +      var ctx = MockAudioContext.instances[0];
> +      assert.equal(ctx.mozAudioChannelType, 'normal');
> +    });

nit: Let's add a test that ensures we instantiate a new context when calling TonePlayer.start() too.
Attachment #8510385 - Flags: review?(gsvelto) → review+
Landed with additional unit test:
https://github.com/mozilla-b2g/gaia/commit/559626fb9e9f7ed8efadaed7dad42a1ea98a2894
Status: NEW → RESOLVED
Closed: 10 years ago
Resolution: --- → FIXED
Comment on attachment 8510385 [details] [diff] [review]
Don't initialize an AudioContext on Callscreen init.

[Approval Request Comment]
[Bug caused by] (feature/regressing bug #): Unknown. Possibly bug 848954, but we suspect that this just unmasked the underlying problem.
[User impact] if declined: Very quiet sound will go through speakers at all times, draining the battery.
[Testing completed]: Gabriele and I tested this.
[Risk to taking this patch] (and alternatives if risky): Low. Bug 834530 may also help here.
[String changes made]: None.
Attachment #8510385 - Flags: approval-gaia-v2.1?(release-mgmt)
Shawn, Randy, please verify that this fixes the issue for you on master.
Flags: needinfo?(shuang)
Flags: needinfo?(rlin)
I will uplift this myself.
Whiteboard: NO_UPLIFT
Hi Doug,
I can't find the refCont increases during the boot-up stage.
Version: 
  Gaia-Rev        dedd8c658df4f83e19531098a74394a3bf9cd2ae
  Gecko-Rev       https://hg.mozilla.org/mozilla-central/rev/d8de0d7e52e0
  Build-ID        20141023160203
  Version         36.0a1
  Device-Name     flame
  FW-Release      4.4.2
  FW-Incremental  eng.cltbld.20141023.191612
  FW-Date         Thu Oct 23 19:16:22 EDT 2014
  Bootloader      L1TC00011660
Flags: needinfo?(rlin)
Hi Doug,
I've tried your patch. Yes, that fixed the original problem for boot-up.

But I noticed that whenever you launched Dialer app, AudioContext will be created, as you mentioned previously. If user dial numbers and make some calls once, speaker turned on forever, it still can drain the battery, even Dialer app was been killed manually. I guess that will be another bug and needs to be followed up.
Flags: needinfo?(shuang)
Shawn, could you please file that new bug.
Flags: needinfo?(shuang)
See also: Bug 1088668
Flags: needinfo?(shuang)
Attachment #8510385 - Flags: approval-gaia-v2.1?(release-mgmt) → approval-gaia-v2.1+
Whiteboard: [CR 741215]
Whiteboard: [CR 741215] → [caf priority: p2][CR 741215]
Hi, I'm on latest 2.2 and I'm still suffering by those ticking sounds, during phone calls it is far from pleasant. Which bug tracks this (from my perspective) continuing problem? Thx...
(In reply to Marek Raida from comment #51)
> Hi, I'm on latest 2.2 and I'm still suffering by those ticking sounds,
> during phone calls it is far from pleasant. Which bug tracks this (from my
> perspective) continuing problem? Thx...

I'm not very sure the problem you have (ticking sounds)? But about AudioConext was created due to callscreen, you probably need to track bug 834530. bug 834530 seems to me a full solution.
You may open a bug to describe your ticking sounds problem in detail (with video).
Hmmm, I'll try to record it in some quiet environment, but it is definitely related to boot-up sequence (in my case), immediately after reboot sounds are there and it is related to some Wifi/GSM/interferration, because Flight mode solves the problem...
Veriried the issue is fixed on 2.2 and 2.1 Flame
Empty sound is not writing into 

Device: Flame 2.2 Master KK 
BuildID: 20141107073659
Gaia: 779f05fead3d009f6e7fe713ad0fea16b6f2fb31
Gecko: b62ccf3228ba
Gonk: 48835395daa6a49b281db62c50805bd6ca24077e
Version: 36.0a1 (2.2 Master)
Firmware: V188-1
User Agent: Mozilla/5.0 (Mobile; rv:36.0) Gecko/36.0 Firefox/36.0

Device: Flame 2.1 KK
BuildID: 20141107001205
Gaia: 6295f6acfe91c6ae659712747dd2b9c8f51d0339
Gecko: 8c23b4f2ba29
Gonk: 48835395daa6a49b281db62c50805bd6ca24077e
Version: 34.0 (2.1)
Firmware: V188-1
User Agent: Mozilla/5.0 (Mobile; rv:34.0) Gecko/34.0 Firefox/34.0
Status: RESOLVED → VERIFIED
QA Whiteboard: [QAnalyst-Triage?]
Flags: needinfo?(ktucker)
QA Whiteboard: [QAnalyst-Triage?] → [QAnalyst-Triage+]
Flags: needinfo?(ktucker)
Well, I reopened my elder issue https://bugzilla.mozilla.org/show_bug.cgi?id=1082630 with some fresh info about data interfering problem with some very bad, but at least some audio attached...
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: