)]}'
{
  "log": [
    {
      "commit": "775fa3cd32ffbb1c27011388287c5bc2b968e3bb",
      "tree": "ee6dbe548d447b7cf337af1fd81161933a664a03",
      "parents": [
        "35c1a2dc1f874fea4600d8c59f8ad4a61edc5624"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Apr 09 06:11:48 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Apr 09 06:11:48 2010 -0700"
      },
      "message": "Additional fix for isssue 2548710: Native AudioTrack resources never freed.\n\nThis changes fixes the issue for the direct output thread that was not\naddressed by commit 71f37cd8a175ee00635cb91506d6810fd02b5b51.\n\nChange-Id: I1bbe26be5f444415dd97270e49257650f5d2858f\n"
    },
    {
      "commit": "deea502a920d3739efae5a29c6fbf56780d68501",
      "tree": "3e97de9342e02549a42f7de706763a5431ebe916",
      "parents": [
        "54de5d19bcdf0addf19fe55599bb5b3835e85690"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Mar 31 12:21:17 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Mar 31 12:36:34 2010 -0700"
      },
      "message": "Fix isssue 2548710: Native AudioTrack resources never freed.\n\nThe problem is a bug in AudioFlinger::MixerThread::prepareTracks_l() that makes that even if the TrackHandle\nis destroyed, the corresponding Track will remain active as long as frames are ready for mixing.\nIf the track uses shared memory (static mode) and the sound is looped, this track will play for ever.\n\nThe fix consists in removing the track from active list immediately if the track is terminated.\n\nChange-Id: I4582aa1d981079ab79be442fb6185f5afaed5cf3\n"
    },
    {
      "commit": "101e77a31bd0c4cc49280a7dba78507fef08072f",
      "tree": "ec1792bf8902e5d4858dbfe5f84419a75b283c3a",
      "parents": [
        "b3a5395f4a26600c01aec1522e6ea8efdb7eecfb"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Mar 11 14:47:00 2010 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Mar 16 17:32:18 2010 -0700"
      },
      "message": "Fix issue 2416481: Support Voice Dialer over BT SCO.\n\n- AudioPolicyManager: allow platform specific choice for opening a direct output.\n Also fixed problems in direct output management.\n- AudioFliinger: use shorter standby delay and track inactivity grace period for direct output\nthread to free hardware resources as soon as possible.\n- AudioSystem: do not use cached output selection in getOutput() when a direct output\ncan be selected.\n\nChange-Id: If44b50d29237b8402ffd7a5ba1dc43c56f903e9b\n"
    },
    {
      "commit": "d5ea969b41d02d6fe1a54637b46a809d06ad4d4b",
      "tree": "5e1d957c0a853723d09159afe0284838f372d4e6",
      "parents": [
        "71b2c240fd19e085d492ca9125aa75a347e410a6"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Mar 05 12:18:01 2010 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 09 14:16:01 2010 -0800"
      },
      "message": "Initial version of LifeVibes integration.\nAlso changed tabs to spaces in other audioflinger files.\n"
    },
    {
      "commit": "4f1fcc2890f7db5509740c3daedf51ee3a38869e",
      "tree": "e4d043825e143afdfb9f6283404a40396512b0f3",
      "parents": [
        "5500621e72abff8bd753fdb781dbc423978bca13"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Mar 02 18:38:06 2010 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Mar 05 11:54:23 2010 -0800"
      },
      "message": "Fix issue 2428563: Camera rendered inoperable by voice call interruption.\n\nThe problem is that AudioRecord never exits read() when a timeout occurs while trying\nto get new PCM data from audio hardware input buffer: it just keeps waiting and retrying until stop() is called.\nIn the same time, opencore AndroidAudioInput::audin_thread_func() loop cannot be exited when stuck\nin AudioRecord::read() because the iExitAudioThread flag can only be sampled when AudioRecord::read()\nreturns. We remain stuck with the audio input thread running.\n\nThe fix consists in modifying AudioRecord behavior in case of timeout when getting new PCM samples.\nWe now wait only one timeout period and try to restart audio record, in case the problem is due to a media_server\nprocess crash. If this fails, we exit read() with a number of bytes read equals to 0 so that\nAndroidAudioInput::audin_thread_func() loop can exit.\n\nAlso modified Audioflinger::RecordThread() loop so that we attempt to recover from HAL read errors.\nIn case of read error, the input stream is forced to standby so that next read attempt does a\nreconfiguration and restart of the audio input device.\n"
    },
    {
      "commit": "134ccbd131c87bfe712ca4e3af5f18e9d11dc040",
      "tree": "918100dea7b054e012192dba956248f58a98e87b",
      "parents": [
        "37e168eec4f4c7ed414487b2c6b32350754ac548"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Feb 26 02:47:27 2010 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Mar 02 08:20:13 2010 -0800"
      },
      "message": "Issue 2071329: audio track is shorter than video track for video capture on sholes\n\nAdd API to retrieve number of frames dropped by audio input kernel driver.\n\nSubmitted on behalf of Masaki Sato \u003cmasaki.sato@motorola.com\u003e\n"
    },
    {
      "commit": "0dd0d2944a0a7b985db162dec8b49b77d689d171",
      "tree": "dde15fc2105fbf0aa8af4df71f5d73a16688a3f2",
      "parents": [
        "10e6d20fb3083693fc3e0378b982d08cfd9ce034"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon Jan 25 19:00:00 2010 -0800"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri Jan 29 14:51:06 2010 -0800"
      },
      "message": "Simplify the MemoryDealer implementation\n\nAt some point the implementation became complicated because of\nSurfaceFlinger\u0027s special needs, since we are now relying on gralloc\nwe can go back to much simpler MemoryDealer.\n\nRemoved HeapInterface and AllocatorInterface, since those don\u0027t need\nto be paramterized anymore. Merged SimpleMemory and Allocation.\nMade SimplisticAllocator non virtual.\n\nRemoved MemoryDealer flags (READ_ONLY, PAGE_ALIGNED)\n\nRemoved a lot of unneeded code.\n"
    },
    {
      "commit": "e9ed2721f4e1f06494e8c90684af9a2490d44a29",
      "tree": "83f4a6843ce5c9aac355d22f6ce810c33d95b0c3",
      "parents": [
        "26ae5b2f6644bb7514aafaead8f6af7e925c1b0f"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jan 19 17:37:09 2010 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jan 26 18:40:39 2010 -0800"
      },
      "message": "Fix issue 2285561: New AudioFlinger and audio driver API needed for A/V sync\n\nAdded getRenderPosition() API to IAudioFlinger to retreive number of audio frames\nwritten by AudioFlinger to audio HAL and by DSP to DAC.\n\nAdded getRenderPosition() API to AudioHardwareInterface to retreive number of audio frames\nwritten by DSP to DAC.\n\nExposed AudioTrack::getPosition() to AudioSink() to make it available to media player.\n\nRemoved excessive log in AudioHardwareGeneric.\n"
    },
    {
      "commit": "43c0b0a1f6b025ae84013cdaa663ee892ac8e4da",
      "tree": "f09028a08d14f78b959934f1fed99c8ff3f0d900",
      "parents": [
        "5e4b03124898d84a16f4ef46c01f25f61a1af238"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Jan 25 08:49:09 2010 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Jan 25 14:00:10 2010 -0800"
      },
      "message": "Fix issue 2378022: AudioService should direct volume control to STREAM_VOICE_CALL stream when STREAM_VOICE_CALL stream is active.\n\nModified AudioService.getActiveStreamType() so that STREAM_VOICE_CALL is selected when a track using this stream\ntype is playing.\n\nChanded isMusicActive() for a more generic isStreamActive(stream) method in AudioSystem, IAudioFlinger and AudioFlinger.\n"
    },
    {
      "commit": "7e2aad1e27fd52292d5b4dade6f411b3fc5a5e8a",
      "tree": "9d4864f4a6ca7ba7f575a0e3db96319bb52fa7ff",
      "parents": [
        "c717b34fa141a4fe8c6af1ad8aa367576cf85c6d"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Dec 18 05:47:48 2009 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Dec 22 09:06:46 2009 -0800"
      },
      "message": "Fix issue 2323920: Notification \u0026 A2DP audio stutter.\n\nModified AudioFlinger duplicating output thread so that audio tracks are not mixed until both outputs (A2DP and hardware) have exited standby mode. This avoids to have one output far ahead of the other and audio frames dropped because the compensation mechanism cannot keep up.\nAlso calculate the maximum wait time in OutputTrack::write() based the on smallest frame count of all output threads instead of the frame count of the thread the OutputTrack is connected to. This avoids starving the thread with the smallest frame count by waiting too long on the other thread.\nSince the frame count was reduced on hardware output to reduce latency the difference between A2DP and hardware outputs frame counts had become problematic.\nAlso increased the number of overflow buffers to cope with bigger timing differences among outputs.\n"
    },
    {
      "commit": "fed9382a6a5a1d81c513b028da11bb6ca372a00c",
      "tree": "b4ce2b236ca408f9f1ac1701912b1e686a2d6796",
      "parents": [
        "0aa2563bb75fe16926575d08f16a49951bd018ef"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Dec 07 10:53:10 2009 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Dec 07 12:30:22 2009 -0800"
      },
      "message": "Fix issue  2306779: Runtime restart - Init failed at android.media.ToneGenerator.\n\nThe ToneGenerator failed to initialize because no more tracks were available in AudioFlinger mixer.\n\nAll tracks were used because the duplicating output was failing to free the tracks on audio hardware output mixer when exiting due to a misplaced test on output activity: output tracks where only freed if the duplicating output was active when exiting.\n\nThe fix consists in freeing the output tracks when the duplicating thread is destroyed without condition.\n"
    },
    {
      "commit": "5291095089264734307ae7456e0f5183e4690463",
      "tree": "ad1b1bbe8acc01e3a6accb1c102db7364199db7e",
      "parents": [
        "d313000d3a79e1de0f9e66a9dc1b62e7dcd88785"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Sat Dec 05 05:20:01 2009 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Dec 07 05:37:47 2009 -0800"
      },
      "message": "Fix issue 2304669: VoiceIME: starting and canceling voice IME yields persistent \"error 8\" state on future attempts and breaks voice search.\n\nFixed AudioFlinger::openInput() broken in change ddb78e7753be03937ad57ce7c3c842c52bdad65e\nso that an invalid IO handle (0) is returned in case of failure.\nApplied the same correction to openOutput().\nModified RecordThread start procedure so that a failure occuring during the first read from audio input stream is detected and causes\nthe record start to fail.\nModified RecordThread stop procedure to make sure that audio input stream fd is closed before we exit the stop function.\n\nFixed AudioRecord JAVA and JNI implementation to take status of native AudioRecord::start() into account\nand not change mRecordingState to RECORDSTATE_RECORDING if start fails.\n"
    },
    {
      "commit": "d3fc8ac6c52c20a6dc2de15d7cf306da8442e414",
      "tree": "b9c1b545313b136bf2acf4892223c7f64f6ee376",
      "parents": [
        "87029dbc462479fd46ea3150567fdbdfbca94a85"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Dec 01 02:17:41 2009 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Dec 01 02:17:41 2009 -0800"
      },
      "message": "Fix issue 2292062: Audio freezes for three seconds when choosing ringtones with a headset connected and music playing.\n\nThe problem comes from a deadlock with AudioPolicyService mutex: When the second ringtone starts,\nthis mutex is locked by AudioPolicyService::startOutput() which in turn calls setParameters() to change the output device.\nAudioflinger::ThreadBase::setParameters() signals the parameter change to the AudioFlinger mixer thread and waits for a condition\nindicating that the parameter change has been processed.\nAt the same time, the mixer thread detects that the audio track corresponding to the first ring tone has been killed and calls its destructor.\nThis calls AudioPolicyService::releaseOutput() which tries to lock the AudioPolicyService mutex.\nIf this happens before the mixer thread can process the setParameters() command we are deadlocked.\nThe deadlock ends because setParameters() uses a timeout when waiting for the condition.\n\nThis regression was introduced by change 33736 fixing issue 2265163.\n\nThe fix consists in calling AudioPolicyService::releaseOutput() from Track::destroy() instead of from Track destructor: as detroy() is never called from the mixer thread loop (as opposed to the destructor) the deadlock described above cannot occur.\n"
    },
    {
      "commit": "09b4ba82d7b6eb5e701fe4127ca93e3dcb93d4b1",
      "tree": "86622c2a2da9ac0f658fde6b84ecbc5171a5a655",
      "parents": [
        "574917c87f039edffa3873acc485ad775ce7a750"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Nov 19 09:00:56 2009 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Nov 19 23:57:45 2009 -0800"
      },
      "message": "Issue 2265163: Audio still reported routed through earpiece on sholes\n\nThis is a second attempt to fix the audio routed to earpiece syndrom.\nThe root cause identified this time is the crash of an application having an active AudioTrack playing on the VOICE_CALL stream type.\nWhen this happens, the AudioTrack destructor is not called and the audio policy manager is not notified of the track stop.\nResults a situation where the VOICE_CALL stream is considered as always in use by audio policy manager which makes that audio is routed to earpiece.\n\nThe fix consists in moving the track start/stop/close notification to audio policiy manager from AudioTrack to AudioFlinger Track objet.\nThe net result is that in the case of a client application crash, the AudioFlinger TrackHandle object (which implements the remote side of the IAudioTrack binder interface) destructor is called which in turn destroys the Track object and we can notify the audio policy manager of the track stop and removal.\n\nThe same modification is made for AudioRecord although no bug related to record has been reported yet.\nAlso fixed a potential problem if record stop is called while the record thread is exiting.\n"
    },
    {
      "commit": "0e49d35fa4cdd4fde41829a9d6ed0f841febe06d",
      "tree": "0398db81f741e36f5109eac77180e0a75ed8d8f1",
      "parents": [
        "d7c1513bda6367c76d4b2cdf8875bc518bc860ee"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Nov 09 23:32:22 2009 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Nov 11 12:13:27 2009 -0800"
      },
      "message": "Improvements for issue 2197683:\tEnglish IME key-press latency is noticeably higher on passion than sholes\n\nThis change goes with a kernel driver change that reduces the audio buffer size from 4800 bytes (~27ms) to 3072 bytes (~17ms).\n- The AudioFlinger modifcations in change 0bca68cfff161abbc992fec82dc7c88079dd1a36 have been removed: the short sleep period was counter productive when the AudioTrack is using the call back thread as it causes to many preemptions.\n- AudioFlinger mixer thread now detects long standby exit time and in this case anticipates start by writing 0s as soon as a track is enabled even if not ready for mixing.\n- AudioTrack::start() is modified to start call back thread before starting the IAudioTrack so that thread startup time is masked by IAudioTrack start and mixer thread wakeup time.\n"
    },
    {
      "commit": "7b57085a7353f368e8797ca5e4684a05fb55f26f",
      "tree": "8fb118fcec8ae2e9328f62720bf3794711b7b9b7",
      "parents": [
        "5dc4fb08493aa9cf34dc81283c850b9b6a998ce8"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Nov 09 04:45:39 2009 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Nov 09 04:45:39 2009 -0800"
      },
      "message": "AudioFlinger: delete Track object when createTrack() fails due to lack of tracks in AudioMixer.\n\nThis problem was encountered as a side effect of issue 2245298.\n"
    },
    {
      "commit": "ee47d43ed3692c8af682689b415c65dc1e45c866",
      "tree": "abc0cf1aec71bde8152cfd558ab0d60fc202036a",
      "parents": [
        "982b02c44243591ea3e1cfa3cc417882f1407fc1"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Sat Nov 07 00:01:32 2009 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Sat Nov 07 01:18:20 2009 -0800"
      },
      "message": "More log for issue 2242381.\n\nAdded more log in system dump for AudioFlinger and AudioPolicyService to help debug issue 2242381 and other issues where the audio driver hangs.\n"
    },
    {
      "commit": "134aa9c94240283c8b89f67146d8c7301274a192",
      "tree": "aa681486dcaad1825b4e2cc22d6345f9e4a8bc64",
      "parents": [
        "db95a9e824f51c39a40833ee3c80daf6b6af3247"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Oct 30 11:09:39 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Nov 02 00:13:56 2009 -0800"
      },
      "message": "Fix issue 197683: English IME key-press latency is noticeably higher on passion than sholes. Part 2.\n\nReduce sleep time in AudioFlinger mixer thread when no data has been written to output to speed up startup time when  exiting standby.\n\nThe rest of the modifications for this issues is in kernel driver:\n commit 0dbb0ee136ed8de757df1ae26d84556c1751deae for buffer size modification from 8192 to 4800 bytes.\nAnother kernel improvement that is not submitted yes will reduce delay when audio output is exiting standby.\n"
    },
    {
      "commit": "63da2b65f9cedf2d629bd5b35c51921bbb899a79",
      "tree": "3ef1f764fafbb2ea46cb525d0deda13ab77133db",
      "parents": [
        "47bd9427f9e725e462f30edf55c4ed37463b194c"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Oct 21 08:14:22 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Oct 21 12:29:37 2009 -0700"
      },
      "message": "Fix issue 2192181: AudioFlinger must provide separated methods to set VOICE_CALL stream volume and down link audio volume.\n\nAdded setVoiceVolume() method to AudioSystem, AudioFlinger, IAudioFlinger, AudioPolicyService.\nRemoved call to AudioHardwareInterface::setVoiceVolume() from AudioFlinger::setStreamVolume().\n"
    },
    {
      "commit": "f5e868baf96fd6e3c4ab386ba6c4f7574a7307b9",
      "tree": "0c6a7b573e5564a0f1acc009a7d8bb0c22a31775",
      "parents": [
        "cfc7010ef822fdd63b6486601edbac21549aec7a"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Oct 05 20:29:18 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Oct 06 18:59:35 2009 -0700"
      },
      "message": "Fix issue 2139634: DTMF tones on Sholes popping, hissing (audio latency too high).\n\nThis change is a complement to the main fix in kernel driver for the same issue (partner change #1250).\nIt removes clicks sometimes heard after the end of the tones while audio flinger is sending 0s to the audio output stream.\nThe problem was that the sleep time between two writes was more than the duration of one audio output stream buffer which could cause some underrun.\n\nAlso fixed a recent regression in ToneGenerator that made that the end of previous tone was repeated at the beginning of current one under certain timing circumstances when the maximum tone duration was specified.\n"
    },
    {
      "commit": "2d70c80a7f31ea9277c75af9666116e338482b09",
      "tree": "b21e44193f4ca006b4c34d4775e5ab5639b50339",
      "parents": [
        "a04f14a57a3d29e7f9d8b47e9594b5054115de70"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 29 11:12:57 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Sep 30 14:48:20 2009 -0700"
      },
      "message": "Fix issue 2153835: AudioFlinger: setParameters() can remain stuck if output thread is terminated.\n\nWait for the parameter set completed condition with a time out in ThreadBase::setParameters().\nAlso lock AudioFlinger mutex before accessing thread list in AudioFlinger::setParameters() and keep a strong reference\non the thread being used in case it is exited while processing the request.\n"
    },
    {
      "commit": "8a95a45fd9ba591ed93c138f36d656a4c1679ef7",
      "tree": "98e92aa41c42078ba34c9b88807611de47263dc3",
      "parents": [
        "bd64edbcd9739af96666e99a2b7ef2acf5f516b7"
      ],
      "author": {
        "name": "Dave Sparks",
        "email": "davidsparks@android.com",
        "time": "Wed Sep 30 03:09:03 2009 -0700"
      },
      "committer": {
        "name": "Dave Sparks",
        "email": "davidsparks@android.com",
        "time": "Wed Sep 30 03:09:03 2009 -0700"
      },
      "message": "Reduce the log spew from AudioFlinger due to a certain device that can\u0027t meet latency timing. Bug 2142215.\n"
    },
    {
      "commit": "aef692f50f2dd4e80cd0588b57bab92769573486",
      "tree": "04beef6db39d8a504289cd4ca46e49cfada98618",
      "parents": [
        "31c07199619c46b3f909dc83f643a8a6826dbcd7"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 22 00:35:48 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 22 00:35:48 2009 -0700"
      },
      "message": "Fix issue 2116700: Ringer screwy while connected over Bluetooth.\n\nThere was a regression introduced in AudioFlinger by change 24114 for suspended output:\nThe suspended output was not reading and mixing audio tracks.\nWhen the phone is ringing, the A2DP output is suspended if the SCO headset and A2DP headset are the same. As the ringtone is played over the duplicated output, the fact that the A2DP output was not reading data was causing the hardware output to be stalled from time to time.\n"
    },
    {
      "commit": "0f8ab670c09988da64732a09d3a67d913e458900",
      "tree": "80e59c55884ab0d53778829ebfafe1898dd37eeb",
      "parents": [
        "5140a13b5eff0b9ba89cb954ba645ca468257548"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Sep 17 05:12:56 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Sep 17 09:26:04 2009 -0700"
      },
      "message": "Fix issue 2127371: Possible race condition in AudioFlinger::openRecord() when a Track is being destroyed.\n\nThe fix consists in locking AudioFlinger::mLock mutex in the TrackBase destructor before clearing the strong pointer to the shared memory client. The mutex is not locked in removeclient() any more which implies that we must make sure that the Client destructor is always called from the TrackBase destructor or that we hold the mLock mutex before calling deleting the Client.\n"
    },
    {
      "commit": "bdc0f84793a3586ee67c3ca3d1d322cf9ad69bfb",
      "tree": "960dffa10f2f5c1d4930f1f907b0a832ccd0a629",
      "parents": [
        "99e7cd8fb90fd94fa79f4716f2b5d1ac742126c8"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Sep 16 06:02:45 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Sep 16 06:02:45 2009 -0700"
      },
      "message": "Fix issue 2123668: Class scope typo in AudioFlinger.cpp.\n"
    },
    {
      "commit": "b3687ae925280a7addfaa0b724218bf8db197725",
      "tree": "025c297f138df00c11e1bd7474242def1cc06891",
      "parents": [
        "f5733b2938151fda955f01d9dc3ad15f7292604d"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 15 07:10:12 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 15 07:10:12 2009 -0700"
      },
      "message": "Fix issue 2118464: cannot play ring tones and notifications after disconnecting BT headset while in call.\n\nThe problem comes from the fact that when the duplicated output is closed after BT headset disconnection, the OUTPUT_CLOSED notification is not sent to AudioSystem. Then the mapping between notification stream and duplicated output cached in AudioSystem is not cleared and next time a notification is played, the duplicated output is selected and the createTrack() request is refused by AudioFlinger as the selected output doesn\u0027t exist.\nThe notification is ignored by AudioFlinger because when it is sent by the terminating playback thread, the thread has already been removed from the playback thread list.\n\nThe fix consists in sending the notification in closeOutput() and not when exiting the playback thread.\nThe same fix is applied to record threads.\n"
    },
    {
      "commit": "a6e58fe31667fab8ccfd01912a5e76e5c6f6d71f",
      "tree": "a3f3b0d5c5bc2882949e140b10efc4e0695841b7",
      "parents": [
        "f79cbd93e679f70c44d00542036deb306f07a809"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Sep 14 01:38:42 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Sep 14 02:37:15 2009 -0700"
      },
      "message": "Fix issue 2115450: a2dp thread is started, even though we are only connected to headset and not playing music.\n\nThis is due to a regression introduced by change 24114: when no audio tracks are ready for mixing, 0s are written to audio hardware. However this should only happen if tracks have already been mixed since the audio flinger thread woke up.\nAlso do not write 0s to audio hardware in direct output threads when audio format is not linear PCM.\n"
    },
    {
      "commit": "6ad8c64ce9ac6fff7a3f2510cd948f3457842510",
      "tree": "fe14ee8d6e89b905c1e6ca9cd3cd127876522494",
      "parents": [
        "4982510436cb9065ab48efc29cdc82c7b326e1d6"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Sep 09 05:16:08 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Sep 09 05:16:08 2009 -0700"
      },
      "message": "Fix issue 2107584: media server crash when AudioFlinger fails to allocate memory for track control block.\n\nAudioFlinger: verify that mCblk is not null before using it in Track and RecordTrack contructors.\nIAudioFlinger: check result of remote transaction before reading IAudioTrack and IAudioRecord.\nIAudioTrack and IAudioRecord: check result of remote transaction before reading IMemory.\n"
    },
    {
      "commit": "3522c808192848ba40ffc7c602de4210266da705",
      "tree": "77b81830f0f5366bcffd939bca96a5758e56e96b",
      "parents": [
        "e40e5507007b15035b81811a5cc2298572e732a2"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Sep 07 08:38:38 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 08 22:56:07 2009 -0700"
      },
      "message": "Fix issue 1992233: DTMF tones on Sholes is really long.\n\nAdd a parameter to ToneGenerator.startTone() allowing the caller to specify the tone duration. This is used by the phone application to have a precise control on the DTMF tone duration which was not possible with the use of delayed messaged.\nAlso modified AudioFlinger output threads so that 0s are written to the audio output stream when no more tracks are ready to mix instead of just sleeping. This avoids an issue where the end of a previous DTMF tone could stay in audio hardware buffers and be played just before the beginning of the next DTMF tone.\n"
    },
    {
      "commit": "08d3d1d001941b396b2c5e615ab8b885eefc12b4",
      "tree": "ffcd7ecd2819a5a20cb956155ae401872f8772f6",
      "parents": [
        "2dcf5dae9864c103e8f03495d58ed89a14f1020e"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Sep 03 03:45:52 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Sep 03 04:11:18 2009 -0700"
      },
      "message": "fix issue 2096657: Sholes: residue shutter sound heard ONCE while taking a picture AFTER the volume is turned off.\n\nDo not ramp volume if the first frame of a track is processed after the track was stopped.\nIn the case of very short sounds, the track stop request can be received by AudioFlinger just after the start request before the first frame is mixed by AudioMixer. In this case, the track is already in stopped state and initial volume is applied with a ramp for the first frame processed which should not be the case: initial volume change is always applied immediatelly.\n"
    },
    {
      "commit": "0643771ad09faad0b75565291fe4d41bfc8d4be2",
      "tree": "f47c585c457a7fed85f6a9d83c8d2b5de35ee9f1",
      "parents": [
        "ae4d3a4f42b41e6bd54a7aa94140f1337e1cb6c5"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 01 05:56:26 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 01 05:56:26 2009 -0700"
      },
      "message": "Fix issue 2091594: music chirp after disconnecting A2DP.\n\nIn AudioFlinger::MixerThread::putTracks(), change the mFillingUpStatus flag to FS_FILLING for active tracks so that mute request is executed without ramping volume down when the track is moved from A2DP to hardware output.\nAlso modified AudioFlinger::setStreamOutput() so that the notification of the change is sent only once to AudioSystem.\n"
    },
    {
      "commit": "c80b1a0034eaf41779ee6c254cb7de00484549a6",
      "tree": "fb2dffa55344227014d5efb95c904021c54f40da",
      "parents": [
        "392f61b0fcd87f672f1f7a7a2234e60f9fc71039"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Aug 28 10:39:03 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Aug 31 02:10:20 2009 -0700"
      },
      "message": "Fix issue 2085690: AudioFlinger must properly terminate the input and output threads when destroyed.\n\nCall closeInput() for all inputs and closeOutput() for all outputs before deleting audio hardware in AudioFlinger destructor.\n"
    },
    {
      "commit": "f5aba82cb7175547c0e2a697dc5d806a7203d2fa",
      "tree": "8564d48ba85748bdb281a3bcda22b41ed17c72e8",
      "parents": [
        "9e7b81943bb40b0d8d6d8b87cad40c10796864d9"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Aug 10 23:22:32 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 11 09:43:09 2009 -0700"
      },
      "message": "Fix issue 2046140: master: media_server crash when powering down A2DP headset while a ringtone is playing.\n\nThis is because the AudioFlinger duplicating thread is closed while the output tracks are still active. This cause the output tracks objects to be destroyed at a time where they can be in use by the destination output mixer.\n\nThe fix consists in adding the OutputTrack to the track list (mTracks) of its destination thread so that a strong reference is help during the mixer processed and the track is detroyed only when safe by destination thread.\n\nAlso added detection of problems when creating the output track (e.g. no more tracks in mixer). In this case the output track is not added to output track list of duplicating thread.\n"
    },
    {
      "commit": "9e7b81943bb40b0d8d6d8b87cad40c10796864d9",
      "tree": "8e74cd406d7b91db33ca9e205a21bb107de7af8d",
      "parents": [
        "0ecc6d9232d518d28293153187dd77922e2e453f"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Aug 10 02:41:54 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 11 09:07:44 2009 -0700"
      },
      "message": "Fix issue 2043314: Recorded audio is choppy.\n\nFixed cut/paste error causing constant reset of current frame index in input buffer.\n"
    },
    {
      "commit": "878c0e1d686bbd804cf33e3b4ea8304f79523263",
      "tree": "a9b3ff8d2d7ecdd42810dca14f967143f0ee0ace",
      "parents": [
        "ae07aadd2620297bb1296448b088ef2155ec1a77"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Aug 10 08:15:12 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Aug 10 08:15:12 2009 -0700"
      },
      "message": "Limit AudioFlinger mixer track sampling rate.\n\nWhen changing the audio output stream sampling rate with setParameters() make sure that all tracks have a sampling rate less or equal to 2 times the new output sampling rate.\n"
    },
    {
      "commit": "f9df24932fb94fb5503f834206bf84b173cfeb8b",
      "tree": "30d0658fd995fdb0261147d4768aafad0dfaba88",
      "parents": [
        "b368f280c384a408ae568372e735e487c411dc9c"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Aug 06 08:49:39 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Aug 07 10:31:53 2009 -0700"
      },
      "message": "AudioService now differentiates BT headsets and car kits.\n\nThe BT headset detection now makes the difference between car kits and headsets, which can be used by audio policy manager.\nThe headset connection is also detected earlier, that is when the headset is connected and not when the SCO socket is connected as it was the case before. This allows the audio policy manager to suspend A2DP output while ringing if a SCO headset is connected.\n"
    },
    {
      "commit": "dae20d9b7f1af8607dfbf3540d041bee7b286ae9",
      "tree": "2177b85ee37c9257d5f0d32dba8b46e8311893de",
      "parents": [
        "29b9eff418b065ec2232360fc2af5913902074c1"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 04 08:37:05 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Aug 07 10:19:09 2009 -0700"
      },
      "message": "Fix problem in AudioFlinger closeOutput and closeInput.\n\nThere was no garanty that the corresponding thread destructor had been already called when exiting the closeOutput() or closeInput() functions.\nThis contructor could be called by the thread after the exit condition is signalled. By way of consequence, closeOutputStream() could be called after\nwe exited closeOutput() function.\n\nTo solve the problem, the call to closeOutputStream() or closeInputStream() is moved to closeOutput() or closeInput().\n"
    },
    {
      "commit": "3464c015ad2fb6e95525b294614217e5c5607013",
      "tree": "4ef4fcb66b2eada23b8a12f561573ffff5599e8e",
      "parents": [
        "119ed307eaa1f2fddc3606ba0342acbf0e501a71"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 04 09:45:33 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Aug 07 09:28:40 2009 -0700"
      },
      "message": "Fix lockup in audio flinger threadbase setParameters.\n\nThe function checkForNewParameters_l() is called with the ThreadBase mutex mLock locked. In the case where the parameter change implies\nan audio parameter modification (e.g. sampling rate) the function sendConfigEvent() is called which tries to lock mLock creating a deadlock.\n\nThe fix consists in creating a function equivalent to sendConfigEvent() that must be called with mLock locked and does not lock mLock.\n\nAlso added the possibility to have more than one set parameter request pending.\n"
    },
    {
      "commit": "e0e9ecc0ce17cce2e681d099426da9d4d3d83377",
      "tree": "e4c73b5c2df9f6df3bc16912c1be7d0974e1b9af",
      "parents": [
        "3b2734f443d2799717e8b2b1847c8e2841764582"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jul 28 08:44:33 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Aug 07 00:27:19 2009 -0700"
      },
      "message": "Fix issue 2001214: AudioFlinger and AudioPolicyService interfaces should not use pointers as handles to inputs and outputs.\n\nUse integers instead of void* as input/output handles at IAudioFlinger and IAudioPolicyService interfaces.\nAudioFlinger maintains an always increasing count of opened inputs or outputs as unique ID.\n"
    },
    {
      "commit": "d55d179e95baecdd9722dbd1c169608cb819716c",
      "tree": "844a052e9b68cd44ce4041e8b3258606767e571f",
      "parents": [
        "728d0c2a7f49a8eecc185502775759442d60a5b4"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jul 28 06:11:55 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jul 28 06:11:55 2009 -0700"
      },
      "message": "Fix issue 2004229: DTMF tones play through earpiece (G1).\n"
    },
    {
      "commit": "fd558a97edd04399fabf54965f14cd6628479cb0",
      "tree": "76cb8fd8f2c16b0f7614fd8e6f8fb954ee441ac9",
      "parents": [
        "1edcb09170aa279506cc520991baa6e0b69d0595"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 23 13:35:01 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 23 13:53:19 2009 -0700"
      },
      "message": "Fix issue 1999585: audioflinger crash.\n\nWe were looping on the number of playback threads when dumping record threads.\n"
    },
    {
      "commit": "9395d9be9c516a2468e2cf741a0e5a9c7615ef82",
      "tree": "7b09540ee38a0a9cd6993b0364fee3a8607efeec",
      "parents": [
        "b253b42978b4d5c2fe53f11401d8bea56923e378"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 23 13:17:39 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 23 13:17:39 2009 -0700"
      },
      "message": "Fix the sim build.\n"
    },
    {
      "commit": "9d91ad5d99c1318f7f1435370e29f3f337afe82f",
      "tree": "a7cd0ed053e743e9b71a440aebf83325b829bad5",
      "parents": [
        "eba4009d897b30f2e24bb464468489c739f93e17"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Jul 17 12:17:14 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 23 06:03:39 2009 -0700"
      },
      "message": "Fix issue 1795088       Improve audio routing code\n\nInitial commit for review.\nIntegrated comments after patch set 1 review.\nFixed lockup in AudioFlinger::ThreadBase::exit()\nFixed lockup when playing tone with AudioPlocyService startTone()\n"
    },
    {
      "commit": "07c8a20f3913b20983c6b9c65b2e62269ace6923",
      "tree": "d77560cf925ec142911b2046ac38945297916644",
      "parents": [
        "33489f5866afaaf1297114de5efde3cdc8671dbe"
      ],
      "author": {
        "name": "Nick Pelly",
        "email": "npelly@google.com",
        "time": "Wed Jul 15 12:22:55 2009 -0700"
      },
      "committer": {
        "name": "Nick Pelly",
        "email": "npelly@google.com",
        "time": "Wed Jul 15 12:22:55 2009 -0700"
      },
      "message": "Standby A2DP audio hardware interface when disabling A2DP.\n\nPatch supplied on advice of partner. This causes us to send suspend_sink to\nBluez via socket interface, so we enter suspend on the A2DP link faster.\nThis is especially important when switching to SCO so that we come closer to\nwhitepaper recommendations to suspend A2DP before setting up SCO.\n\nWe have another patch set to add DBUS A2DP suspend and resume calls to Bluez\nthat will do a better job of following whitepaper recommendations for\nA2DP -\u003e SCO -\u003e A2DP, but this small patch is still an improvement.\n"
    },
    {
      "commit": "17500c2031135c501c975ba2f2d1121878251aa8",
      "tree": "a842609e9c64cb2f3310f70483016c2327b4e801",
      "parents": [
        "f99e79a60dc2d2a19dcd197e3d71fe10a819e976",
        "7c4d746e29ff96be6d2f021633be3eced876ce71"
      ],
      "author": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Jul 09 12:49:43 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Jul 09 12:49:43 2009 -0700"
      },
      "message": "am 3893da46: Merge change 6614 into donut\n\nMerge commit \u00273893da46f0a97d59a7687ae2bd71ba855eb5ffe3\u0027\n\n* commit \u00273893da46f0a97d59a7687ae2bd71ba855eb5ffe3\u0027:\n  Fix issue 1970108: crash in AudioFlinger::isMusicActive()\n"
    },
    {
      "commit": "b025ca0c83356f204ae4948b744f3f068e5330c4",
      "tree": "46e7bd3331c00b23e88b23f985a0c6b99acaee97",
      "parents": [
        "35da5ddb6bead090f0542f3eb3d547fd411b4b42"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 09 03:20:57 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 09 03:20:57 2009 -0700"
      },
      "message": "Fix issue 1970108: crash in AudioFlinger::isMusicActive()\n\nProtected calls to MixerThread::isMusicActive() by AudioFlinger::mLock\n"
    },
    {
      "commit": "8434c7886221bbc0abac9cc25488bbbd02380ceb",
      "tree": "696dbddaa2d28f5703db1bfde685893afe9722b7",
      "parents": [
        "f6476d6967e3e5c46e1ea1e5096c31ad0fd528d1",
        "0bac53801b5e38e71eb6eb1759b6b8b09e79bbe7"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jul 07 09:36:14 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Jul 07 09:36:14 2009 -0700"
      },
      "message": "am 88e209dc: Fix issue 1743700: AudioTrack: setPlaybackRate can not set the playback rate to twice of the ouputSR\n\nMerge commit \u002788e209dcf8c2ebddda5c272f46d1bd5478bc639c\u0027\n\n* commit \u002788e209dcf8c2ebddda5c272f46d1bd5478bc639c\u0027:\n  Fix issue 1743700: AudioTrack: setPlaybackRate can not set the playback rate to twice of the ouputSR\n"
    },
    {
      "commit": "0bac53801b5e38e71eb6eb1759b6b8b09e79bbe7",
      "tree": "49c10cbd27551d276c09ea71cdfbfdcca74e596e",
      "parents": [
        "0cf7312c8bcc74e4dcec688ba59151df29640845"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jul 07 07:10:45 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jul 07 07:10:45 2009 -0700"
      },
      "message": "Fix issue 1743700: AudioTrack: setPlaybackRate can not set the playback rate to twice of the ouputSR\n\nStore sample rate on 32 bits instead of 16 bits in audio_track_cblk_t.\nRemoved sampleRate() methods from AudioTrack and AudioRecord: replaced by getSampleRate().\nAudioTrack::setSampleRate() no returns a status.\n"
    },
    {
      "commit": "7887aa766ed5fea5c3b29096cdb269f890e5163f",
      "tree": "229b66593a2a8e04f993de6198a9c5c0f5478561",
      "parents": [
        "b63dea9658e2b70f17ce7b0b6ebf4c06b6ab6ce9",
        "9fc5f84201aebb34f2ca33e54c1c0cc307089caf"
      ],
      "author": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jul 03 08:18:22 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jul 03 08:18:22 2009 -0700"
      },
      "message": "am 2bbb80e1: Merge change 5994 into donut\n\nMerge commit \u00272bbb80e183c6492689f8b10b2d0f5dfe9872a6ac\u0027\n\n* commit \u00272bbb80e183c6492689f8b10b2d0f5dfe9872a6ac\u0027:\n  Less logging in some places.  More in others.\n"
    },
    {
      "commit": "00dae0a08479b0c2c9ddc5c491a2bebb1c43b028",
      "tree": "af2ac581ac60a38788251e50d35e2243d5e6ebd3",
      "parents": [
        "eee4987d2c52be74697b4c9c0cf4622081cf7abd"
      ],
      "author": {
        "name": "Joe Onorato",
        "email": "joeo@android.com",
        "time": "Wed Jul 01 21:04:03 2009 -0400"
      },
      "committer": {
        "name": "Joe Onorato",
        "email": "joeo@android.com",
        "time": "Wed Jul 01 21:04:03 2009 -0400"
      },
      "message": "Less logging in some places.  More in others.\n"
    },
    {
      "commit": "e5eb06d98bc4759e3a248e2ece034cca9d103e28",
      "tree": "171eadda1b903980d9040c248ba62d0392a9dba5",
      "parents": [
        "d87acc22284078acc7077b8c833a1b36a377ad6a",
        "52192700a7a00c44c9737b8f991a3d266b72a278"
      ],
      "author": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri May 29 09:42:26 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri May 29 09:42:26 2009 -0700"
      },
      "message": "am d9cc7659: Merge change 2706 into donut\n\nMerge commit \u0027d9cc7659fa9b8544e2a3ca7b7040fbd79afdf7ea\u0027\n\n* commit \u0027d9cc7659fa9b8544e2a3ca7b7040fbd79afdf7ea\u0027:\n  Fix issue 1883666: Audio coming from the music player stopped suddenly\n"
    },
    {
      "commit": "01c4ba35637e1c3fbddcb80ce619345812f23c3f",
      "tree": "7be144bfbcbc6c7a8d8e327a2aa45e22669561d7",
      "parents": [
        "ce3647052d06127dc1996391a7d5fdeec6c88b20"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri May 29 02:03:21 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri May 29 02:03:21 2009 -0700"
      },
      "message": "Fix issue 1883666: Audio coming from the music player stopped suddenly\n\nThe problem comes from the code handling the automatic change of audio routing to speaker when notifications are played. The music is also muted while the sound is forced to speaker.\nTo avoid truncating the end of the notification, a delay is inserted between the end of the notification and the restoration of the audio routing.  If a new notification starts during this delay, the current music mute state read and saved before muting music corresponds to the forced mute due to previous notification. When the new notification ends, the mute state restored is muted and music stream stays muted for ever.\n\nThe fix consists in reading and saving music mute state only if the audio routing has been restored (check that mForcedRoute is back to 0).\n"
    },
    {
      "commit": "a26299d276452ccf04f9b9625eadc49c0bf1650b",
      "tree": "14cda48fb18392b4dc08a607283bd75af4289e3a",
      "parents": [
        "192c1dc653009e2c39ee4eb386f2644989857913",
        "55be03e18975a211121ac6c3440f63872721f74e"
      ],
      "author": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue May 26 10:11:44 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue May 26 10:11:44 2009 -0700"
      },
      "message": "am de8268d6: Merge change 2331 into donut\n\nMerge commit \u0027de8268d6d1cd168510c490b17e93154d2eab767c\u0027\n\n* commit \u0027de8268d6d1cd168510c490b17e93154d2eab767c\u0027:\n  Fix issue 1846343 - part 1\n"
    },
    {
      "commit": "570dd0b4da533032ba4ec6214eeebb1c90f6d512",
      "tree": "a8b8a21035b6c977ed330022082e9098dfb0ebeb",
      "parents": [
        "dd9d5f68ebd53a307477231c43a53b8870f47a3a"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri May 22 09:18:15 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue May 26 07:44:28 2009 -0700"
      },
      "message": "Fix issue 1846343 - part 1\n\nThis change is the first part of a fix for issue 1846343, :\n- Added new enum values for input sources in AudioRecord and MediaRecorder for voice uplink, downlink and uplink+downlink sources.\n- renamed streamType to inputSource in all native functions handling audio record.\n\nA second change is required in opencore author driver and android audio input to completely fix the issue.\n"
    },
    {
      "commit": "c5b2c0bf8007562536b822eb060fc54a01f8e08b",
      "tree": "da6084f542177972cf72a985b5d2c10330f87de3",
      "parents": [
        "208059f67ed2dd9fa025e07fcb6954d3cb61c79e"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue May 19 19:08:10 2009 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Wed May 20 12:55:03 2009 -0700"
      },
      "message": "move libbinder\u0027s header files under includes/binder\n"
    },
    {
      "commit": "1e26a818e561c3640bf13b6e645077d5b95bb3a9",
      "tree": "aecdafc06c659f1fbeff75ce3c2931056242eb3c",
      "parents": [
        "d0945865cc03d1a31281e97e86c09bada73e7d2d",
        "1afd622be1b213f74731e2dc4b6ea8bab4e36302"
      ],
      "author": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed May 20 08:54:45 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed May 20 08:54:45 2009 -0700"
      },
      "message": "am a59aba8c: Merge changes 2023,2036 into donut\n\nMerge commit \u0027a59aba8cd88b8f98fa4de2a903899bc6ac9f73e8\u0027\n\n* commit \u0027a59aba8cd88b8f98fa4de2a903899bc6ac9f73e8\u0027:\n  Update more references to openInputStream in support classes.\n  Modify AudioFlinger to use updated openInputStream factory method.\n"
    },
    {
      "commit": "0e06d21a227a0991474b572e4416f14e98118c6c",
      "tree": "8f042ecfc5ca62f4acf41bcd0cdbd96a2cb6b864",
      "parents": [
        "a5a11d47e9cfec8b504e625aa5c3eb0db96854f5"
      ],
      "author": {
        "name": "Dave Sparks",
        "email": "davidsparks@android.com",
        "time": "Tue May 19 16:41:29 2009 -0700"
      },
      "committer": {
        "name": "Dave Sparks",
        "email": "davidsparks@android.com",
        "time": "Tue May 19 16:41:29 2009 -0700"
      },
      "message": "Modify AudioFlinger to use updated openInputStream factory method.\nContinuation of bug 1846343\n"
    },
    {
      "commit": "2bcce3696e2fbb2f54f9e0fd18c40a83b2ba11fc",
      "tree": "0057538044583548295d59f7e7c31bc8f5635f48",
      "parents": [
        "37cb461e21c3328bbd6567696a13dfba14136ac6",
        "91a678088520abf63c1484d284629833877ff938"
      ],
      "author": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Wed Apr 22 17:12:34 2009 -0700"
      },
      "committer": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Wed Apr 22 17:12:34 2009 -0700"
      },
      "message": "Merge donut into master\n"
    },
    {
      "commit": "4dd495b72cbe8cf8df03f862e8e600ac14fdf30d",
      "tree": "d97cea1e77ee59dab375fed7e4efcb56b007028a",
      "parents": [
        "ecb28b3021825c7eb2ff65d7d5528e6acf9fc249"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Apr 21 07:56:33 2009 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Apr 21 07:56:33 2009 -0700"
      },
      "message": "Fix issue 1745312: Various cleanups in media framework\n\nAudioTrack, AudioRecord:\n  - remove useless mAudioFlinger member of AudioTrack and AudioRecord.\n  - signal cblk.cv condition in stop() method to speed up stop completion.\n  - extend wait condition timeout in obtainBuffer() when waitCount is -1 to avoid waking up callback thread unnecessarily\n\nAudioFlinger:\n  - remove some warnings in AudioFlinger.cpp.\n  - remove function AudioFlinger::MixerThread::removetrack_l()  as its content is never executed.\n  - remove useless call to setMasterVolume in AudioFlinger::handleForcedSpeakerRoute().\n  - Offset VOICE_CALL stream volume to reflect actual volume that is never 0 in hardware (this fix has been made in the open source): 0.01 + v * 0.99.\n\nAudioSystem.java:\n  - correct typo in comment\n\nIAudioflinger, IAudioFlingerClient:\n  - make AudioFlinger binder interfaces used for callbacks ONEWAY.\n\nAudioHardwareInterface:\n  - correct routeStrings[] table in AudioHardwareInteface.cpp\n"
    },
    {
      "commit": "bdf653f3a4fa8f7c91891e080e8386f490964a48",
      "tree": "765fcdcdb0b79ac79347e1b3694486350134b8fa",
      "parents": [
        "cd3c19ae1542707bdb859a54b925e4b9c5acaef1",
        "c828f6ae9775149fc579827c3841a63b99fbd2a9"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 31 21:34:25 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 31 21:34:25 2009 -0700"
      },
      "message": "Merge commit \u0027goog/readonly-p4-master\u0027\n"
    },
    {
      "commit": "c828f6ae9775149fc579827c3841a63b99fbd2a9",
      "tree": "323ceeb7aa45e73045eb49f781b1b02e4bd58710",
      "parents": [
        "933a9418d95f871c66a3202a71d1815b3b0d24f9"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "",
        "time": "Tue Mar 31 14:34:35 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 31 14:34:35 2009 -0700"
      },
      "message": "AI 143785: am: CL 143775 am: CL 143620 Attempt for fixing crash in AudioFlinger::MixerThread::dumpTracks() seen in bug report for issue 1747119.\n  AudioFlinger::MixerThread::dumpTracks() was reading mTracks[] vector instead of mActiveTracks[] when dumping active tracks.\n  Original author: elaurent\n  Merged from: //branches/cupcake/...\n  Original author: android-build\n  Merged from: //branches/donutburger/...\n\nAutomated import of CL 143785\n"
    },
    {
      "commit": "34c594bde98a3fa8491b22deaed0493f5183c738",
      "tree": "323ceeb7aa45e73045eb49f781b1b02e4bd58710",
      "parents": [
        "cbcb00eb7302a166411c0b87e6a9ed70298f65b2"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "",
        "time": "Tue Mar 31 14:33:34 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 31 14:33:34 2009 -0700"
      },
      "message": "AI 143775: am: CL 143620 Attempt for fixing crash in AudioFlinger::MixerThread::dumpTracks() seen in bug report for issue 1747119.\n  AudioFlinger::MixerThread::dumpTracks() was reading mTracks[] vector instead of mActiveTracks[] when dumping active tracks.\n  Original author: elaurent\n  Merged from: //branches/cupcake/...\n\nAutomated import of CL 143775\n"
    },
    {
      "commit": "933a9418d95f871c66a3202a71d1815b3b0d24f9",
      "tree": "10560743ea2bf036899e083cf968cc042c6edd6b",
      "parents": [
        "253ed06781698a14aa838327d4d1135a11e01e3a"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "",
        "time": "Fri Mar 27 18:18:46 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Mar 27 18:18:46 2009 -0700"
      },
      "message": "AI 143327: am: CL 143177 am: CL 142889 Fix issue #1736153\tCamera shutter sound can be muted by new AlarmClock setting.\n  Current implementation of Camera service plays the camera shutter sound over the ALARM stream so that it cannot be muted by silent mode in order to comply to some country specific requirement. A recent change made it possible for the user to mute the ALARM stream thus making this stream not suitable any more for the camera shutter sound.\n  The fix consists in creating a new stream type only accessible by native code and that cannot be muted and use it to play camera sounds.\n  Original author: elaurent\n  Merged from: //branches/cupcake/...\n  Original author: android-build\n  Merged from: //branches/donutburger/...\n\nAutomated import of CL 143327\n"
    },
    {
      "commit": "cbcb00eb7302a166411c0b87e6a9ed70298f65b2",
      "tree": "10560743ea2bf036899e083cf968cc042c6edd6b",
      "parents": [
        "816c5e2314c8dc241c962efaed6a57c0e20f7330"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "",
        "time": "Fri Mar 27 16:27:16 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Mar 27 16:27:16 2009 -0700"
      },
      "message": "AI 143177: am: CL 142889 Fix issue #1736153\tCamera shutter sound can be muted by new AlarmClock setting.\n  Current implementation of Camera service plays the camera shutter sound over the ALARM stream so that it cannot be muted by silent mode in order to comply to some country specific requirement. A recent change made it possible for the user to mute the ALARM stream thus making this stream not suitable any more for the camera shutter sound.\n  The fix consists in creating a new stream type only accessible by native code and that cannot be muted and use it to play camera sounds.\n  Original author: elaurent\n  Merged from: //branches/cupcake/...\n\nAutomated import of CL 143177\n"
    },
    {
      "commit": "06ee417bc5f07eb783f93233e27ffe2b90225f67",
      "tree": "e5c31a7161ba1ce7e72eab72ea1f42921c1bf0ac",
      "parents": [
        "f804114702ee61b1bcd5034617b59990e453f7b2",
        "b1596ee235b568d4c25313e2d335a1203953663b"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Mar 27 15:38:40 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Mar 27 15:38:40 2009 -0700"
      },
      "message": "Merge commit \u0027korg/cupcake\u0027\n\nConflicts:\n\tcore/java/android/webkit/WebView.java\n\tcore/java/android/widget/TwoLineListItem.java\n\tpreloaded-classes\n"
    },
    {
      "commit": "b1596ee235b568d4c25313e2d335a1203953663b",
      "tree": "f4d5456b806b51a46b7abaa2c33fbd023eb970cf",
      "parents": [
        "192f79fe71af21e6a877bd298b33be92bee6b353"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "",
        "time": "Thu Mar 26 01:57:59 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Mar 26 01:57:59 2009 -0700"
      },
      "message": "Automated import from //branches/cupcake/...@142889,142889\n"
    },
    {
      "commit": "4f68be1a5b53f690f1a7d8ba62cddb5ef0022a96",
      "tree": "1a95b39e1ab320f3fef2e14f3a9ec170a0e0a16f",
      "parents": [
        "ebad147e654682b6f05438ca8f3685809df5d2e2"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Mar 18 17:39:46 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Mar 18 17:39:46 2009 -0700"
      },
      "message": "auto import from //branches/cupcake_rel/...@140373\n"
    },
    {
      "commit": "732ca39b704428b77ef305826d4e6c07190fd7ed",
      "tree": "0b575888c39771713beb00a816479b1cdf53242e",
      "parents": [
        "15c399644d0bd343ef9ed23ccb117e49a0eb7f82",
        "ebad147e654682b6f05438ca8f3685809df5d2e2"
      ],
      "author": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Wed Mar 18 11:33:14 2009 -0700"
      },
      "committer": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Wed Mar 18 11:33:14 2009 -0700"
      },
      "message": "Merge commit \u0027remotes/korg/cupcake\u0027 into merge\n\nConflicts:\n\tcore/java/android/view/animation/TranslateAnimation.java\n\tcore/jni/Android.mk\n\tcore/res/res/values-en-rGB/strings.xml\n\tlibs/audioflinger/AudioFlinger.cpp\n\tlibs/surfaceflinger/LayerScreenshot.cpp\n\tpackages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java\n"
    },
    {
      "commit": "ebad147e654682b6f05438ca8f3685809df5d2e2",
      "tree": "bb7852e568b6d8714e24c5cce9911d925ae05985",
      "parents": [
        "bcef13b666c7459241235bc6209837ae81884d2f"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Mar 13 13:04:22 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Mar 13 13:04:22 2009 -0700"
      },
      "message": "auto import from //branches/cupcake_rel/...@138607\n"
    },
    {
      "commit": "bcef13b666c7459241235bc6209837ae81884d2f",
      "tree": "a1313bb849f73fd1b62d221f60196fe8fd44edf5",
      "parents": [
        "22f8defddca562244d43611d99ce76c3ae65a73e"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Mar 11 12:11:56 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Mar 11 12:11:56 2009 -0700"
      },
      "message": "auto import from //branches/cupcake/...@137873\n"
    },
    {
      "commit": "22f8defddca562244d43611d99ce76c3ae65a73e",
      "tree": "c1e51002d4906cb06bad695ab8decbf19b6cb4b7",
      "parents": [
        "9adf84a4b6735354893ff1e57c129f66d97d75ee"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Mon Mar 09 11:52:12 2009 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Mon Mar 09 11:52:12 2009 -0700"
      },
      "message": "auto import from //branches/cupcake/...@137197\n"
    },
    {
      "commit": "edbf3b6af777b721cd2a1ef461947e51e88241e1",
      "tree": "f09427b843b192cccf8c3b5328cb81dddf6489fa",
      "parents": [
        "d5193d9394c5e58176d7bcdf50ef017f8a3b9e1e"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:31:44 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 19:31:44 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "d5193d9394c5e58176d7bcdf50ef017f8a3b9e1e",
      "tree": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
      "parents": [
        "43aa2b1cbf7a03e248e10f4d0fec0463257cd52d"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:45 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 18:28:45 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@135843\n"
    },
    {
      "commit": "6015dfc996dadefd1494cb3635928f8dce3b5a4c",
      "tree": "7face7aa36b77ca691c46ceca249eb204a457bab",
      "parents": [
        "007452f719a9b3d4f6e2f1cc7344b7bf332dd476"
      ],
      "author": {
        "name": "James E. Blair",
        "email": "corvus@gnu.org",
        "time": "Sat Jan 17 13:30:20 2009 -0800"
      },
      "committer": {
        "name": "Jean-Baptiste Queru",
        "email": "jbq@google.com",
        "time": "Tue Mar 03 16:24:40 2009 -0800"
      },
      "message": "Fix issue #1324: No audible call-waiting indication when in-call volume\nis low\n\nhttp://code.google.com/p/android/issues/detail?id\u003d1324\nRe-base the internally generated in-call audio volume so that it is\nnever muted, which is already the case for the hardware routed in-call\naudio.\n"
    },
    {
      "commit": "43aa2b1cbf7a03e248e10f4d0fec0463257cd52d",
      "tree": "419be3db269033df1a79ef96e10fe15be35ce27d",
      "parents": [
        "0bb03408de8886e8d17013219967d42fb9c8cf8c"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 14:04:24 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Mar 03 14:04:24 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@132589\n"
    },
    {
      "commit": "0bb03408de8886e8d17013219967d42fb9c8cf8c",
      "tree": "6edc73880d91bac5532cdbece4072f7c6ec7d257",
      "parents": [
        "7222586f99599fb2de31293277b79e8d4a3acdc2"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Mon Mar 02 22:54:33 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Mon Mar 02 22:54:33 2009 -0800"
      },
      "message": "auto import from //depot/cupcake/@137055\n"
    },
    {
      "commit": "d2bd26d32612a1c7d5629202e3f41741b7936c60",
      "tree": "f969ce556df0e937d8f77c9dd8d1aa6f2f3bac38",
      "parents": [
        "ac65e0b172b33f7e068c14e3d95678fa20205577"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Feb 19 10:57:31 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Feb 19 10:57:31 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@132276\n"
    },
    {
      "commit": "ac65e0b172b33f7e068c14e3d95678fa20205577",
      "tree": "4c290a9665c829ec3774425563260a94564fcb71",
      "parents": [
        "a6938bab1f6fa76ae98ebbe44f4e534e05fa0993"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Feb 13 12:57:50 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Feb 13 12:57:50 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@131421\n"
    },
    {
      "commit": "a6938bab1f6fa76ae98ebbe44f4e534e05fa0993",
      "tree": "bc5a1f806bd06db8abb197e80be9ead3644c0bcc",
      "parents": [
        "e41dd756db5184519f4dacbf4d95b333822605c7"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Feb 10 15:44:00 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Feb 10 15:44:00 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@130745\n"
    },
    {
      "commit": "e41dd756db5184519f4dacbf4d95b333822605c7",
      "tree": "0298d6b55fa7f37ded4e375216b78720c99719a1",
      "parents": [
        "5f78a48bb8f7714ee231fca67d60fad77bc1cad9"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Jan 22 00:13:42 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Jan 22 00:13:42 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@127436\n"
    },
    {
      "commit": "8a7a67538a9977c892389bfcde76a8372aa0b56c",
      "tree": "0782f82f223ddeafa9b08bd2121ded38212f67f7",
      "parents": [
        "276293246ea9cbc0a578a7697cc48930376ec0e9"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Jan 15 16:12:10 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Thu Jan 15 16:12:10 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@126645\n"
    },
    {
      "commit": "276293246ea9cbc0a578a7697cc48930376ec0e9",
      "tree": "03804488c60dda65699333d2311c8d1842ec4b65",
      "parents": [
        "e09fd9e819c23dc90bca68375645e15544861330"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:51:23 2009 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Fri Jan 09 17:51:23 2009 -0800"
      },
      "message": "auto import from //branches/cupcake/...@125939\n"
    },
    {
      "commit": "e09fd9e819c23dc90bca68375645e15544861330",
      "tree": "9a9fdadd1301625f875a3c126c986c79e3363ac4",
      "parents": [
        "7c1b96a165f970a09ed239bb4fb3f1b0d8f2a407"
      ],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Dec 17 18:05:43 2008 -0800"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Wed Dec 17 18:05:43 2008 -0800"
      },
      "message": "Code drop from //branches/cupcake/...@124589\n"
    },
    {
      "commit": "7c1b96a165f970a09ed239bb4fb3f1b0d8f2a407",
      "tree": "df5a6539447324de36e95b057d6b9f0361b7a250",
      "parents": [],
      "author": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "committer": {
        "name": "The Android Open Source Project",
        "email": "initial-contribution@android.com",
        "time": "Tue Oct 21 07:00:00 2008 -0700"
      },
      "message": "Initial Contribution\n"
    }
  ]
}
