)]}'
{
  "log": [
    {
      "commit": "d6fd85a157ce2054b2304e6d171fa87ae09c363d",
      "tree": "dfba92cafe7500bd06aa5e7927405285ca662ecc",
      "parents": [
        "42539cb5d02f0cbaedba2de6ad6be42a0d7a9a9a",
        "9eaa55756c5b245970447019250ce852f5189525"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 22 13:22:13 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 22 13:22:13 2012 -0800"
      },
      "message": "Merge \"Avoid wp\u003c\u003e::unsafe_get() with a few exceptions\""
    },
    {
      "commit": "9eaa55756c5b245970447019250ce852f5189525",
      "tree": "68428af4a3b22a62f9c09a2c4c7b8a8a95a936fd",
      "parents": [
        "2e77ad2a9f7afb57b6f9127dd7c229e774baa9c8"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 20 13:32:16 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 22 13:19:26 2012 -0800"
      },
      "message": "Avoid wp\u003c\u003e::unsafe_get() with a few exceptions\n\nAvoid using wp\u003c\u003e::unsafe_get() except in a log, and other specific cases\nwhen it\u0027s known to be safe.\n\nUse more specific subclass types for parameters to avoid down-casts.\n\nWhen a constructor or method parameter is \"this\" of an object that is\ncurrently being constructed, it\u0027s better to use a raw pointer rather\nthan either sp\u003c\u003e or wp\u003c\u003e.\n\nUsing the raw pointer is safe, provided either:\n - it is \"this\" of an object being constructed (which has sp\u003c\u003e refcount of 0),\n - or the caller already holds an sp\u003c\u003e\n\nThe raw pointer is simpler and faster, and it avoids the problem of the\nsp\u003c\u003e reference count being incremented and then decremented to zero on\nscope exit, which would cause the object\u0027s destructor to run while the\nobject is still being constructed.\n\nAlso removed some dead code per a review comment.\n\nChange-Id: I7375f64da3aec11b928c33cb01faff186252ef5e\n"
    },
    {
      "commit": "f063b49e95c28d63a58215ebda892a5fee4204cc",
      "tree": "9909300bea158357aa45f1fb64f7b83c15208636",
      "parents": [
        "c33305c5dd4cc06e71eb0c66a7150aa6ab647c99"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 17 16:24:10 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 22 11:46:53 2012 -0800"
      },
      "message": "Fix build warning\n\nwarning: pointer of type \u0027void *\u0027 used in arithmetic\nwarning: enumeral and non-enumeral type in conditional expression\n\nChange-Id: I7b8d626a636145ef648e3b5d0e77068216dd012e\n"
    },
    {
      "commit": "3b81acab52b7140c1b8b20be2d67be3e221637e7",
      "tree": "0b225360603f19ba2f60fb1cf7a616dfe51d99b1",
      "parents": [
        "1b094ee8f7fe7eca65bf3d2f983ba95eef6db93d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 15:26:23 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 17 09:41:56 2012 -0800"
      },
      "message": "Remove bit fields to improve performance\n\nuint16_t enabled is (mostly) changed to bool in a separate CL\n\nChange-Id: Ied9f8c034b2479cee9a8778cee7b8ff92ae75b7b\n"
    },
    {
      "commit": "1b094ee8f7fe7eca65bf3d2f983ba95eef6db93d",
      "tree": "5b3509943e54e317cc30a56cdf1712dc50d7528a",
      "parents": [
        "29dcfcd66d884801e9907d04e81d407ee770802c",
        "a111792f1314479c649d1d44c30c2caf70c00c2a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 17 09:40:43 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 17 09:40:43 2012 -0800"
      },
      "message": "Merge \"Simplify code\""
    },
    {
      "commit": "a111792f1314479c649d1d44c30c2caf70c00c2a",
      "tree": "f67b5f32a61a259f292b7d0d992f31b8e2ff857c",
      "parents": [
        "761defc341c5ce9019a42919c441f035f665ec0d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 10:53:32 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 17 09:39:07 2012 -0800"
      },
      "message": "Simplify code\n\nUse DefaultKeyedVector::valueFor to avoid extra test\nMake local variables as local as possible\nNo double parentheses\nNo typedef for single use\nNo parentheses around indirect function call\nNo AudioFlinger:: prefix when not needed\nRemove unnecessary casts\nRemove block with only one line\n\nSaves 128 bytes\n\nChange-Id: I3a87430eeb01b81e7b81a1c38f6fdd3274ec48f3\n"
    },
    {
      "commit": "29dcfcd66d884801e9907d04e81d407ee770802c",
      "tree": "3b494547cfc30a85df3681e1f35b31346914919e",
      "parents": [
        "9fda4b87441fe17d90d8144639c9de6d9022c3c0",
        "fe5b3ba4b332d5fc9aa4f453434329b9f38768c2"
      ],
      "author": {
        "name": "Mike Lockwood",
        "email": "lockwood@google.com",
        "time": "Fri Feb 17 09:20:43 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 17 09:20:43 2012 -0800"
      },
      "message": "Merge \"Put a bandaid on a segfault in timed audio track handling.\""
    },
    {
      "commit": "fe5b3ba4b332d5fc9aa4f453434329b9f38768c2",
      "tree": "534a0b20d48f361e34531de1b396c17bab264811",
      "parents": [
        "761defc341c5ce9019a42919c441f035f665ec0d"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Sun Feb 12 17:51:21 2012 -0800"
      },
      "committer": {
        "name": "Mike Lockwood",
        "email": "lockwood@google.com",
        "time": "Thu Feb 16 17:59:30 2012 -0800"
      },
      "message": "Put a bandaid on a segfault in timed audio track handling.\n\nAdd a bandaid to prevent a segfault which can occur while handling\ntimed audio buffers.  There is a deeper problem which should\neventually be addressed, but for now this fix should prevent any\ncrashing.\n\nThe deeper problem is as follows.\n\nWhen the AudioFlinger mixer gets data to mix from an AudioTrack, it\nends up getting a structure filled out which points into an IMemory\nregion owned by the AudioTrack.  Unfortunately, this structure is not\nholding a refcount on the IMemory which it points into.  If the\nIMemory refcount hits 0 and the chunk of RAM is retuned to the binder\nheap it came from, there can still be a Buffer object being held by\nthe AudioFlinger mixer which points into the region of memory which\nwas retuned to the binfer heap.  If AF reads from this buffer, it\ncould read corrupt data (if the region of memory gets handed back out\nto a writer), or it could segfault (if the heap has been freed and the\npages unmapped).  Similar problems could happen if AF attempts to\nwrite to the buffer, heap corruption in one case, segfaulting in the\nother.\n\nIn the past, this has not been an issue for AF, because tracks\nallocate a single IMemory (which serves as a ring buffer) and the\nIMemory lives for as long as the track lives.  As an artifact of the\nway the code came out, the mixer cannot be holding a Buffer structure\npointing into the IMemory which used to be owned by a track if the\ntrack no longer exists.  Tracks cannot come into or out of existence\nduring a mix operation, which is the only thing which makes this safe.\n\nTimedTracks work differently, however.  Timed tracks each allocate a\nsmall binder heap, and then hand out IMemory instances  broken out of\nthis heap.  The heap lives as long as the track, so the worst which\ncould happen here is that a TimedTrack\u0027s IMemory gets returned to the\nheap while there is still a buffer structure in flight pointing into\nthe memory region, then the region gets handed out again and\noverwritten by new data causing the mixer to mix the wrong audio.  The\ntiming to cause this to happen is very difficult to encounter, and you\nto generate the timing conditions required, you need to be in a pretty\nbad failure state where audio is already breaking up and skipping, so\nits unlikely that anyone would notice (which is why I\u0027m band-aiding\nthe segfault and letting the deeper issue slide for now).\n\nIn general, however, it might be a good idea to revisit this buffering\ndesign.  On principal, if someone is going to hold pointers into a\nrefcounted object, they should be holding a ref on the object at the\nsame time.  Failure to do this will usually lead to a situation where\nthere are corruption or segfault issues, or to a system where the\nrefcounted object\u0027s lifetime must be implicitly managed very carefully\nin ways which are usually non-obvious and are easy to break by new\nengineers on a project.\n\nChange-Id: Ib391075395ed0ef46a03c37aa38a82d09e88abeb\n"
    },
    {
      "commit": "9fda4b87441fe17d90d8144639c9de6d9022c3c0",
      "tree": "d428b982cf5c83b178dc16d3c3553fdfcae6ce9c",
      "parents": [
        "761defc341c5ce9019a42919c441f035f665ec0d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 02 14:04:37 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 16 16:57:44 2012 -0800"
      },
      "message": "Fixed possible heap corruption in EffectDesc\n\n\"EffectDesc *effect \u003d new EffectDesc(*effects[i]);\" was relying on the\ndefault copy constructor for EffectDesc, but the default copy constructor\ndoes a member-by-member copy.  This works OK for mUuid, but a member\ncopy of mName and mParams shares pointers.  This could result in heap\ncorruption later on due to a double free.  Changed to add an explicit\ncopy constructor that does a deep copy of both mName and mParams.\n\nA malloc() and strdup() were being freed by delete, but the correct\nmatching API for these is free().  Fortunately our current memory runtime\nimplementation ignores the difference. Changed to use free().\n\nEffectDesc and InputSourceDesc member fields were being torn down by\nthe code that does delete.  Changed to do the tear-down in ~EffectDesc()\nand ~InputSourceDesc().\n\nAdded constructor EffectDesc() with name and UUID parameters, rather\nthan having caller fill in the object after construction.\n\nMade ~EffectDesc() and ~InputSourceDesc() non-virtual to save memory,\nsince they have no subclasses.\n\nChange-Id: Ibb5cc2e6760d72e0c4cf537068ac4432c717bafd\n"
    },
    {
      "commit": "ef7740be67a4d7b6b033ebed59c3d4a9c74a2c18",
      "tree": "896b721ec2200ffe089800c7b367b92e88a59f2d",
      "parents": [
        "af7d8189f91c45ab919a6c9ac386b268c8d91168"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Thu Feb 09 11:28:36 2012 -0800"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Thu Feb 16 13:45:12 2012 -0800"
      },
      "message": "Fix a segfault in AudioFlinger.\n\nCheck the string returned by a HAL\u0027s implementation of get_parameters\nfor NULL before attempting to make use of it.  That way, we won\u0027t\nbring down the mediaserver because of a poorly written HAL.\n\nChange-Id: Ic99d7b004520d7d6347842a681c0595e889b68ea\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\n"
    },
    {
      "commit": "4ff14bae91075eb274eb1c2975982358946e7e63",
      "tree": "e9e54fddb9832d30b69c2a11c9ed2884397f2f95",
      "parents": [
        "951bd8d1ad9581a414e171ad8605a9515d0ad667"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Wed Feb 08 16:37:41 2012 -0800"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Thu Feb 16 13:45:11 2012 -0800"
      },
      "message": "Upintegrate Audio Flinger changes from ICS_AAH\n\nBring in changes to audio flinger made to support timed audio tracks\nand HW master volume control.\n\nChange-Id: Ide52d48809bdbed13acf35fd59b24637e35064ae\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\n"
    },
    {
      "commit": "6dad4378f2a78d967defc8912ecf47f6ed117584",
      "tree": "fb4fa4804cfa198fe6a625993c7cff520a492be8",
      "parents": [
        "d9b9b8d09e7471b0ffa21cfa9f944ef4ad300a71",
        "6637baae4244aec731c4014da72418d330636ae1"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 14 09:44:47 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 14 09:44:47 2012 -0800"
      },
      "message": "Merge \"Fix races related to volume and mute\""
    },
    {
      "commit": "d9b9b8d09e7471b0ffa21cfa9f944ef4ad300a71",
      "tree": "e2b8666cc7ca81254ce264129ddd70c076a63ed1",
      "parents": [
        "ed15977476a3d53103866e6d527fa3fb65d4166c",
        "99e53b86eebb605b70dd7591b89bf61a9414ed0e"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 14 09:42:32 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 14 09:42:32 2012 -0800"
      },
      "message": "Merge \"Update comments\""
    },
    {
      "commit": "99e53b86eebb605b70dd7591b89bf61a9414ed0e",
      "tree": "8939550ada02fe21121550a83952ebf7638c0dac",
      "parents": [
        "6dbc1359f778575d09d6da722b060a6d72c2e7c5"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 19 08:59:58 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 14 09:17:59 2012 -0800"
      },
      "message": "Update comments\n\nWe no longer put the filename at start of file.\n\nChange-Id: Ic435b159a23105681e3d4a6cb1ac097bc853302e\n"
    },
    {
      "commit": "8d6a2449a91f5116d7243ab039393195ebd663fe",
      "tree": "a4ac36a5ff020ac5e730a6ec7feaebfd2a14acad",
      "parents": [
        "6dbc1359f778575d09d6da722b060a6d72c2e7c5"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 14:04:28 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 14 09:06:20 2012 -0800"
      },
      "message": "Use size_t and ssize_t with Vector\n\nUse size_t with size() and ssize_t with indexOfKey().  Exception:\nuse ssize_t for backwards loops, and indices that are overloaded as a\nmarker or error code.\n\nChange-Id: Ibf2a360af4539b72b09c818dda22ea2a0de92431\n"
    },
    {
      "commit": "6dbc1359f778575d09d6da722b060a6d72c2e7c5",
      "tree": "721c46e8b89595b51a80ee71c71542895edc1308",
      "parents": [
        "7a8b0ed6419e57dd8b41d3806893d63d3df91aab"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 02 10:56:47 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 14 07:30:48 2012 -0800"
      },
      "message": "AudioRecord and AudioTrack client tid\n\nInform AudioFlinger of the tid of the callback thread.\n\nChange-Id: I670df92dd06749b057238b48ed1094b13aab720b\n"
    },
    {
      "commit": "44deb053252a3bd2f57a007ab9560f4924f62394",
      "tree": "57fac6fb14c9f7897409b54b360afebef59c2e70",
      "parents": [
        "860936d780d98a5968f40e66ca6ae800c67adbc3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Sun Feb 05 18:09:08 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Feb 13 10:30:23 2012 -0800"
      },
      "message": "Factor out and speed up permission-checking code\n\nUse the caching permission check for dump to save IPC.\n\nCache getpid() to save kernel call for other permission checks.\n\nThe C runtime library getpid() can\u0027t cache due to a fork\nrace condition, but we know that mediaserver doesn\u0027t fork.\n\nDon\u0027t construct String16 on the stack.\n\nChange-Id: I6be6161dae5155d39ba6ed6228e7683e67be34ed\n"
    },
    {
      "commit": "2b213bc220768d2b984239511cd4554a96bc0079",
      "tree": "06053ae20ae309df04caa0ad5a63563fe72f5a15",
      "parents": [
        "b6333aa8317ce5162ab006c4baed6b0890936dc7"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 02 14:05:20 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:36:46 2012 -0800"
      },
      "message": "mAudioHwDevs and related cleanup\n\nInline AudioFlinger::initCheck and remove unnecessary lock.\n\nRemove redundant check of mAudioHwDevs.size().\n\nNo need to lock mHardwareLock for each device separately\nduring initialization.\n\nUse size_t not int to loop through Vector, since size() returns size_t.\n\nAdd missing hardware lock for get_mic_mute() and get_input_buffer_size().\n\nAdd comments.\n\nChange-Id: Iafae78ef78bbf65f703d99fcc27c2f4ff221aedc\n"
    },
    {
      "commit": "b6333aa8317ce5162ab006c4baed6b0890936dc7",
      "tree": "d4fb7b888a6b12f4d3c35c0a84d49490dc33bc8e",
      "parents": [
        "3a144d08b713e3c0f6b7b8e95bc42cef5886f4fa",
        "b28686f95daee16edeb5f39af2cd5274ac3dc99f"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:32:16 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 15:32:16 2012 -0800"
      },
      "message": "Merge \"Simplify ThreadBase::exit() aka requestExitAndWait\""
    },
    {
      "commit": "3a144d08b713e3c0f6b7b8e95bc42cef5886f4fa",
      "tree": "b3c0d783ff3b8ef62804701409b038447d3f2cbb",
      "parents": [
        "0d9302d7830b46542821b3e5f3e4f96942bd3cb3",
        "cdf2158f3b9498d6cd0eb228d8bee16e32399e16"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:31:54 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 15:31:54 2012 -0800"
      },
      "message": "Merge \"Disable HQ resamplers for now until qualified\""
    },
    {
      "commit": "0d9302d7830b46542821b3e5f3e4f96942bd3cb3",
      "tree": "f14d8a8e3a243dc6fa7d63d48017132814ff3b86",
      "parents": [
        "858df80948ee64f478782a6a6c06533ba1651ef1",
        "2f732eb768004c6362fae8a02c60b69c9400b032"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:31:07 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 15:31:07 2012 -0800"
      },
      "message": "Merge \"Move header declarations around for clarity\""
    },
    {
      "commit": "858df80948ee64f478782a6a6c06533ba1651ef1",
      "tree": "d5b854a26e507ab8ce03037371146e5a34937151",
      "parents": [
        "95a87908ddf240760e8e8b35a6cafcc149c7f33f",
        "58123c3a8b5f34f9d1f70264a3c568ed90288501"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:30:15 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 15:30:15 2012 -0800"
      },
      "message": "Merge \"Camel case readability \u0026 private disconnect(bool)\""
    },
    {
      "commit": "95a87908ddf240760e8e8b35a6cafcc149c7f33f",
      "tree": "10f8fe22a6b34ae2d82eedc01c3f43cf1039b292",
      "parents": [
        "c8ad36bbb30e99e49026cba78e5e0f83db5cb0f6",
        "d198b61603d5fa9298edea4ddb5852ea45159906"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:29:35 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 15:29:35 2012 -0800"
      },
      "message": "Merge \"Remove aliasing\""
    },
    {
      "commit": "c8ad36bbb30e99e49026cba78e5e0f83db5cb0f6",
      "tree": "b11dc2fa925f100ccad66a2f5aa2cf2d01331117",
      "parents": [
        "31f0acff69efd46897221d847becca79ab15105f",
        "5b9ff43995f6a6b819d9ad37dd8cdc5ad4a088d7"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:28:57 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 15:28:57 2012 -0800"
      },
      "message": "Merge \"Use mul from audioutils\""
    },
    {
      "commit": "31f0acff69efd46897221d847becca79ab15105f",
      "tree": "bf04e79a2935e9426bcd4cdf1815dbfb0c1e6397",
      "parents": [
        "9f1d4448050a4df7118c90c0c0d3e6f9c4b82f3b",
        "004f719467c498942c40de9f260be601ee45e630"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:28:45 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 15:28:45 2012 -0800"
      },
      "message": "Merge \"Mark fields const if only set in constructor\""
    },
    {
      "commit": "b28686f95daee16edeb5f39af2cd5274ac3dc99f",
      "tree": "84d9f579f42b724ca4c1dce405f3c8a5901e9d9d",
      "parents": [
        "7ae4a2c130ec2cb5dec69d095b810698acc543b3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 06 08:39:38 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:02:44 2012 -0800"
      },
      "message": "Simplify ThreadBase::exit() aka requestExitAndWait\n\nWe can remove mExiting and use Thread::exitPending() instead.\n\nThe local sp\u003c\u003e on \"this\" in exit() is not needed, since the caller must\nalso hold an sp\u003c\u003e in order to be calling us. (Unless it was using a raw\npointer, but that would be dangerous for other reasons.)\n\nAdd comment explaining the mLock in exit().\n\nChange-Id: I319e5107533a1a7cdbd13c292685f3e2be60f6c4\n"
    },
    {
      "commit": "9d1f02d74fd395ec4de6861147da289423f0ab6f",
      "tree": "127f5a23da9e17614da1c5f7d84002f3c80c9016",
      "parents": [
        "0ba18ec1b343a8de70924f87630dd1f329b00fe6"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 17:47:58 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 13:48:44 2012 -0800"
      },
      "message": "Follow raw pointer and sp\u003c\u003e conventions\n\nUnconditional delete for raw pointers.\nUse \"if (sp !\u003d 0)\" not \"if (sp.get() !\u003d 0)\" or \"if (sp !\u003d NULL)\".\nUse \"if (raw !\u003d NULL)\" not \"if (raw)\".\n\nChange-Id: I531a8da7c37149261ed2f34b862ec4896a4b785b\n"
    },
    {
      "commit": "0ba18ec1b343a8de70924f87630dd1f329b00fe6",
      "tree": "13000f3913f814761effcd771b93a66a5f46341a",
      "parents": [
        "12018d80add66f5558675614d73fa6549150806e",
        "90bebef5669a9385c706b042d146a31dca2e5d9b"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 13:36:24 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 13:36:24 2012 -0800"
      },
      "message": "Merge \"No newline or space at end of ALOG format string\""
    },
    {
      "commit": "12018d80add66f5558675614d73fa6549150806e",
      "tree": "8fbeaafce1f62e72edcef8d43a6a435fb3fe301c",
      "parents": [
        "8b5980798ca06e57b1284e6e23fa220e1207bf41",
        "b7bf796b758e144f94f6ed4d16c21bf22a118fb3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 13:33:31 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 13:33:31 2012 -0800"
      },
      "message": "Merge \"Move declaration of stream_type_t up earlier\""
    },
    {
      "commit": "8b5980798ca06e57b1284e6e23fa220e1207bf41",
      "tree": "253051dc7a47b0338667ef777c2a0ada373eb4df",
      "parents": [
        "5a4b1aaee6109252e268b1e5d0c15b59e21ce993",
        "23d82a9bc9a43b49ba684ba40875b91db310d3b9"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 13:33:02 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 13:33:02 2012 -0800"
      },
      "message": "Merge \"Fix typos in ALOG for pid vs tid\""
    },
    {
      "commit": "cdf2158f3b9498d6cd0eb228d8bee16e32399e16",
      "tree": "21af355df3a1f1d8d559b419fe8daf37c46dadbc",
      "parents": [
        "7ae4a2c130ec2cb5dec69d095b810698acc543b3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 02 14:01:58 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 09 18:14:44 2012 -0800"
      },
      "message": "Disable HQ resamplers for now until qualified\n\nThis saves about 6500 bytes.\n\nChange-Id: I87102fe561c95c19c9e615dea3de914f96639257\n"
    },
    {
      "commit": "2f732eb768004c6362fae8a02c60b69c9400b032",
      "tree": "e47161097aae718d7496059fd53b0238f3627a53",
      "parents": [
        "7ae4a2c130ec2cb5dec69d095b810698acc543b3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 09:48:03 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 09 17:29:26 2012 -0800"
      },
      "message": "Move header declarations around for clarity\n\nPut IAudioFlinger methods in binder opcode order.\nMove hardware call state closer to where it is used.\ngetMode() and btNrecIsOff() are private.\n\nChange-Id: Ie50340b396c39c763f2b155cbc08da8a0d0f2424\n"
    },
    {
      "commit": "004f719467c498942c40de9f260be601ee45e630",
      "tree": "92763f0176b88c463d756e04a6109deb42ec441d",
      "parents": [
        "7ae4a2c130ec2cb5dec69d095b810698acc543b3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 09:26:17 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 09 17:00:15 2012 -0800"
      },
      "message": "Mark fields const if only set in constructor\n\nChange-Id: Iacd06bb9efaf708cf965033be1f2297b58f7f75c\n"
    },
    {
      "commit": "d198b61603d5fa9298edea4ddb5852ea45159906",
      "tree": "3c03752e50c74f4bcdcf185d8e84e00788ffea04",
      "parents": [
        "7ae4a2c130ec2cb5dec69d095b810698acc543b3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 02 14:09:43 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 09 16:58:07 2012 -0800"
      },
      "message": "Remove aliasing\n\nCode was aliasing mBuffer as buffer, but continuing to use both buffer\nand mBuffer after that point.  This was at best misleading, and at worst\ncould confuse the compiler into generating bad code.  There was no\nperformance advantage to the alias, in fact removing it saves 16 bytes.\n\nChange-Id: I55023ddba465d9be82f66745b088d18af658ac60\n"
    },
    {
      "commit": "58123c3a8b5f34f9d1f70264a3c568ed90288501",
      "tree": "19111bc4d31bd66596fc47272fe778f1ea1af9d9",
      "parents": [
        "98ec94c5854daccc3474758524e7f4adfe535ce0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 10:32:24 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 09 16:43:39 2012 -0800"
      },
      "message": "Camel case readability \u0026 private disconnect(bool)\n\nChange-Id: If66516ed2703e048c5e6ccc6cd431446a024f4a1\n"
    },
    {
      "commit": "5b9ff43995f6a6b819d9ad37dd8cdc5ad4a088d7",
      "tree": "bfa47df10004a01c070003633ac7096a8496e3d5",
      "parents": [
        "7ae4a2c130ec2cb5dec69d095b810698acc543b3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 09 08:22:46 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 09 16:34:23 2012 -0800"
      },
      "message": "Use mul from audioutils\n\nI verified that the disassembled output is identical.\n\nChange-Id: I34a76f0842ebc4aef2c923e079e38d0bc1f98b5c\n"
    },
    {
      "commit": "23d82a9bc9a43b49ba684ba40875b91db310d3b9",
      "tree": "380803dbedfeeb154242e465da524c061f91ff40",
      "parents": [
        "7ae4a2c130ec2cb5dec69d095b810698acc543b3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 11:10:00 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 09 16:33:17 2012 -0800"
      },
      "message": "Fix typos in ALOG for pid vs tid\n\nChange-Id: I6dc70f137d0ff8a86427ab8882a81886e1de0782\n"
    },
    {
      "commit": "90bebef5669a9385c706b042d146a31dca2e5d9b",
      "tree": "a60c6383825eb3ed02493036605391d015732190",
      "parents": [
        "98ec94c5854daccc3474758524e7f4adfe535ce0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 15:24:38 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 17:21:49 2012 -0800"
      },
      "message": "No newline or space at end of ALOG format string\n\nChange-Id: I0bef580cbc818cb7c87aea23919d26f1446cec32\n"
    },
    {
      "commit": "6637baae4244aec731c4014da72418d330636ae1",
      "tree": "5244135379ecfdd8ce7394ccfed0b363ccabcf56",
      "parents": [
        "98ec94c5854daccc3474758524e7f4adfe535ce0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 09 09:40:36 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 17:01:49 2012 -0800"
      },
      "message": "Fix races related to volume and mute\n\nFix race conditions when setting master volume, master mute, stream\nvolume, stream mute for a playback thread, and when reading stream\nvolume of a playback thread.  Lock order is AudioFlinger, then thread.\n\nRename streamVolumeInternal to streamVolume_l, comment, and use it to\nimplement streamVolume().\n\nCode size reduction:\n - Remove dead code: AudioFlinger::PlaybackThread::masterVolume, masterMute, streamMute.\n - Change return type of non-binder methods that always succeed from status_t to void.\n - Remove virtual from volume and mute methods that don\u0027t need it.\n\nThis change saves 228 bytes but decreases performance of binder operations\ndue to the added locks.\n\nChange-Id: Iac75abc1f54784873a667d1981b2e08f8f31e5c9\n"
    },
    {
      "commit": "b7bf796b758e144f94f6ed4d16c21bf22a118fb3",
      "tree": "ae407de10945e65b4092455db41ae6b8b3c8462c",
      "parents": [
        "98ec94c5854daccc3474758524e7f4adfe535ce0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 12:36:25 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 12:54:31 2012 -0800"
      },
      "message": "Move declaration of stream_type_t up earlier\n\nstream_type_t is used by AudioFlinger class, so it should be declared there.\nThis way we don\u0027t have to peek into PlaybackThread to get the declaration.\n\nChange-Id: Ie08bab1604699214d1e8df2d48d3fbfbbc436e96\n"
    },
    {
      "commit": "02bbd20cece1785c223ac4ca2ddc635931a80673",
      "tree": "f43adecd4648ff511eacc7ca2921c167ed3220de",
      "parents": [
        "98ec94c5854daccc3474758524e7f4adfe535ce0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 12:35:35 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 12:52:00 2012 -0800"
      },
      "message": "Rename type() to streamType()\n\nThis avoids possible confusion with thread\u0027s type().\nAlso remove redundant cast \"(audio_stream_type_t)\".\n\nChange-Id: I320b9177b6c267a102d215f002228bcf988c437a\n"
    },
    {
      "commit": "98ec94c5854daccc3474758524e7f4adfe535ce0",
      "tree": "bec80965e65828ee2f890d25c275fd3bf422eb45",
      "parents": [
        "72ef00de10fa95bfcb948ed88ab9b7a177ed0b48"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jan 25 14:28:29 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 10:24:54 2012 -0800"
      },
      "message": "Combine duplicate code \u0026 document wp\u003c\u003e in mClients\n\nChange-Id: Iea8cfe8e57563337fb2484a1246ef79d6ad3db18\n"
    },
    {
      "commit": "72ef00de10fa95bfcb948ed88ab9b7a177ed0b48",
      "tree": "beeaffd33a57a6cc5fa48f2fa905fc680c4746d1",
      "parents": [
        "dbfafaffe2e97eaf8d74ec6b6c468418a1ad2443"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 17 11:09:42 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 10:06:32 2012 -0800"
      },
      "message": "Use audio_io_handle_t consistently instead of int\n\nOther:\n - add a comment to nextUniqueId\n - made ThreadBase::mId const, since it is only assigned in constructor.\n\nChange-Id: I4e8b7bec4e45badcde6274d574b8a9aabd046837\n"
    },
    {
      "commit": "dbfafaffe2e97eaf8d74ec6b6c468418a1ad2443",
      "tree": "594fe80487e000923e244f40ecd3adbd138608fb",
      "parents": [
        "5e92a7861196ddae14638d4b7a63fc4892b7ef59"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jan 25 15:27:15 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 09:49:14 2012 -0800"
      },
      "message": "Simplify destructors\n\nRemove explicit clear() when the order doesn\u0027t matter.\n\nChange-Id: I5931bc7ef5f681c7ce329aa9ec0a6e46d34a56c5\n"
    },
    {
      "commit": "5e92a7861196ddae14638d4b7a63fc4892b7ef59",
      "tree": "6772b944a26acb22381a2eb38871b46cff9d856a",
      "parents": [
        "0a20fa9c41c96e31fa20e071074a4b6e7f6c41c3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 07:40:52 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 09:21:39 2012 -0800"
      },
      "message": "Effect UUID inputs passed by pointer are const\n\nChange-Id: I1f5c338bcb7368e3dd8cd5f804b2e6d9fbe087f8\n"
    },
    {
      "commit": "0a20fa9c41c96e31fa20e071074a4b6e7f6c41c3",
      "tree": "128bf63eaea4d94fbf42d6954cd92046f90bf98e",
      "parents": [
        "b61ec89bb0c701b3bd06eb658f854230681f8b39",
        "bb001926447d0b7dc71ca8bb3c9856f3136d8f4c"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 08:40:28 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 08 08:40:28 2012 -0800"
      },
      "message": "Merge \"Use pid_t not int\""
    },
    {
      "commit": "b61ec89bb0c701b3bd06eb658f854230681f8b39",
      "tree": "d1281080768cd8ab98f97cc331e2e7bb27019059",
      "parents": [
        "63d2daed17ab749baa80bc808fb5083b688b771b",
        "1a0ae5be3d1273cba12584b33830d859510fbf82"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 08:40:15 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 08 08:40:15 2012 -0800"
      },
      "message": "Merge \"Don\u0027t double destruct audio_track_cblk_t\""
    },
    {
      "commit": "63d2daed17ab749baa80bc808fb5083b688b771b",
      "tree": "735cfc77d2082c044816fe367f33401fd5b472c7",
      "parents": [
        "4f9b0c54011eb8fd2ccfb393c2dcd51cd07800e0",
        "c59c004a3a6042c0990d71179f88eee2ce781e3c"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 08:39:39 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 08 08:39:39 2012 -0800"
      },
      "message": "Merge \"AudioFlinger methods const and inline\""
    },
    {
      "commit": "86feafe15b3f9609e1e9f64184688c2b6f2e4834",
      "tree": "281f6c3826240aeabc62820918b9e206a6cfb76e",
      "parents": [
        "e616d4e6de6d53ddebbc3d7fb381af94589c2232",
        "c19e22450e6e3d07594c935c7a9522e85e909e82"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 08:33:41 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 08 08:33:41 2012 -0800"
      },
      "message": "Merge \"Use virtual destructors\""
    },
    {
      "commit": "e616d4e6de6d53ddebbc3d7fb381af94589c2232",
      "tree": "ec4258e62eeb8cc12077af1a8dae45b6b4f0d6cb",
      "parents": [
        "f22147e5d2982e0c461f7ce8058c2d596d518bd4",
        "090f01963e215f895020a31e22368cd44e086ce3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 07:45:15 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 08 07:45:15 2012 -0800"
      },
      "message": "Merge \"Improve performance for sp\u003c\u003e on stack\""
    },
    {
      "commit": "1579d7948117e3e6541b0cfda02cc5234a3280ea",
      "tree": "b86c07193eb8e2d6d313e1136fccffa043d4c7af",
      "parents": [
        "b5a66e15f371143f48665bbd462d75309582845d",
        "7378ca506e4e20c2b2d4e94a131cf1b95831adb5"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 07:41:44 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 08 07:41:44 2012 -0800"
      },
      "message": "Merge \"Use 0 not NULL for sp\u003c\u003e and wp\u003c\u003e\""
    },
    {
      "commit": "b5a66e15f371143f48665bbd462d75309582845d",
      "tree": "45d58fa394a3d11bb4fb68ab6356191d863fc559",
      "parents": [
        "e98bbd36d67243fe987b09904956550a68af1cc7",
        "4c340c6521b634f159d2d6bc4e9359226fd8edf8"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 07:40:23 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 08 07:40:23 2012 -0800"
      },
      "message": "Merge \"Use bool instead of int\""
    },
    {
      "commit": "e98bbd36d67243fe987b09904956550a68af1cc7",
      "tree": "3ad396f50bb4ad8e1bbf9fa939c4978851ec998b",
      "parents": [
        "dfa75555098a385ac8f4d29a73b32d66501f133d",
        "f587ba5b991c7cd91e4df093d0d796bd419e5d67"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 07:39:27 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 08 07:39:27 2012 -0800"
      },
      "message": "Merge \"Declare more IAudioFlinger methods const\""
    },
    {
      "commit": "1a0ae5be3d1273cba12584b33830d859510fbf82",
      "tree": "8073be7b5e33ee230159f7c0aed22bb6de63d3f9",
      "parents": [
        "787bae0578fbaab6219ebf23494866b224d01438"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 10:24:48 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 16:16:46 2012 -0800"
      },
      "message": "Don\u0027t double destruct audio_track_cblk_t\n\nFortunately audio_track_cblk_t doesn\u0027t have a destructor, but for clarity\nremove the double destruction.\n\nAlso add warning not to add any virtuals to audio_track_cblk_t.\n\nChange-Id: I70ebe1a70460c7002145b2cdf10f9f137396e6f3\n"
    },
    {
      "commit": "bb001926447d0b7dc71ca8bb3c9856f3136d8f4c",
      "tree": "fe9e3f0deff3396abf15bbff29f5b8a1d6f50175",
      "parents": [
        "787bae0578fbaab6219ebf23494866b224d01438"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 11:10:26 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 16:14:15 2012 -0800"
      },
      "message": "Use pid_t not int\n\nChange-Id: Iad1c2fd4152e94080ad8c65c13ddf4519fc2ed27\n"
    },
    {
      "commit": "d5e54f7a36daedc3b2a642d1499c262da04e6280",
      "tree": "9a56f54d6431ad2f7f0d2c6817f1e9f568bca769",
      "parents": [
        "787bae0578fbaab6219ebf23494866b224d01438"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 09:50:01 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 16:09:30 2012 -0800"
      },
      "message": "Remove dead code\n\nmFormat is unused in resampler\nmClientTid is unused\nlocal variable pid is unused in dump\n\nChange-Id: Ib156e38029366620bfeff2a13e73471867155a5b\n"
    },
    {
      "commit": "f587ba5b991c7cd91e4df093d0d796bd419e5d67",
      "tree": "0fe274cdfa6dcae81617725b5ea376c86245b104",
      "parents": [
        "787bae0578fbaab6219ebf23494866b224d01438"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 16:25:10 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 15:40:56 2012 -0800"
      },
      "message": "Declare more IAudioFlinger methods const\n\nThis is just documentation, as C++ method const-ness doesn\u0027t mean anything\nfor a binder API.  Instead, here const means \"no side effects\".\n\nChange-Id: Iaa9cd2fe477db10ae9a40cac4f79f0faa9b4e5e6\n"
    },
    {
      "commit": "4c340c6521b634f159d2d6bc4e9359226fd8edf8",
      "tree": "7cfdf3bedccd84f751909ee5866871576250f274",
      "parents": [
        "787bae0578fbaab6219ebf23494866b224d01438"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 12:33:54 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 15:36:47 2012 -0800"
      },
      "message": "Use bool instead of int\n\nThe .h is not modified to avoid increasing data size.\n\nChange-Id: Ide4a821a5b16424ffa03471dfff98dc3e9b5f751\n"
    },
    {
      "commit": "c59c004a3a6042c0990d71179f88eee2ce781e3c",
      "tree": "68e0c9bb6d5bb10a1a8263ebefbb5601946702ee",
      "parents": [
        "787bae0578fbaab6219ebf23494866b224d01438"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 02 14:06:11 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 15:25:24 2012 -0800"
      },
      "message": "AudioFlinger methods const and inline\n\nThis saves 1063 bytes and probably improves performance.\n\nChange-Id: I11cf0dfd925fbaec75e3d1b806852a538eae5518\n"
    },
    {
      "commit": "c19e22450e6e3d07594c935c7a9522e85e909e82",
      "tree": "2a81eb366d10425b83b6bbf9997d9c8813515ea1",
      "parents": [
        "787bae0578fbaab6219ebf23494866b224d01438"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 14:54:39 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 14:42:43 2012 -0800"
      },
      "message": "Use virtual destructors\n\nIt turns out to be just a comment, as all except AudioMixer are RefBase.\n\nThere are only a few performance-sensitive cases where it\u0027s worth thinking\nabout whether you need a virtual destructor, and the headache usually\noutweighs the benefit.\n\nChange-Id: I716292f9556ec17c29ce8c76ac8ae602cb496533\n"
    },
    {
      "commit": "7378ca506e4e20c2b2d4e94a131cf1b95831adb5",
      "tree": "60a526b206858f294a66194ae3c1bcda08b2e65b",
      "parents": [
        "787bae0578fbaab6219ebf23494866b224d01438"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 20 13:44:40 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 11:20:35 2012 -0800"
      },
      "message": "Use 0 not NULL for sp\u003c\u003e and wp\u003c\u003e\n\nChange-Id: Id1f0c89acefaceed6cb9ca7c165fce895e46d85b\n"
    },
    {
      "commit": "787bae0578fbaab6219ebf23494866b224d01438",
      "tree": "935422276579d6f7c3b4e835e1a79bc9082a2b26",
      "parents": [
        "ff3c83e04ae459c4252b86dd4440b4e37ee92c16",
        "de9719b3ec71472e6bf75117152176af51d1a515"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 08:31:01 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 03 08:31:01 2012 -0800"
      },
      "message": "Merge \"Use audio_in_acoustics_t consistently\""
    },
    {
      "commit": "ff3c83e04ae459c4252b86dd4440b4e37ee92c16",
      "tree": "8de4de832991dd2086313b6168f8523d002f6251",
      "parents": [
        "a0d68338a88c2ddb4502f95017b546d603ef1ec7",
        "3d2f877c1cb4e4ae4ddde7f57f4353de9341f11b"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 08:00:52 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 03 08:00:52 2012 -0800"
      },
      "message": "Merge \"Use ToneGenerator::tone_type consistently\""
    },
    {
      "commit": "a0d68338a88c2ddb4502f95017b546d603ef1ec7",
      "tree": "f052125f4720fde00179d41d4ee04e02934052e4",
      "parents": [
        "87f155d6655b2d3b27e69281a29e85c6407e4d26"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 16:47:15 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 07:57:01 2012 -0800"
      },
      "message": "Use NULL not 0 for raw pointers\n\nUse if (p !\u003d NULL) instead of if (ptr)\n\nChange-Id: Iaec3413a59ccbf233c98fcd918cc7d70ac5da9fa\n"
    },
    {
      "commit": "87f155d6655b2d3b27e69281a29e85c6407e4d26",
      "tree": "65032f39295f3fd280d8478bdc25a14b5362847d",
      "parents": [
        "f81e97e4ec8b01965a5b36987f886cf5001f71ff",
        "d05397144be774f2f3623c754e865f51753e4e31"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 07:46:42 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 03 07:46:42 2012 -0800"
      },
      "message": "Merge \"For performance, return large objects by reference\""
    },
    {
      "commit": "f81e97e4ec8b01965a5b36987f886cf5001f71ff",
      "tree": "25df07b2a8864a1d6b33d2ff0defaecb048e7c39",
      "parents": [
        "84afa3b51ac48f84ed62489529ce78cba7fca00e",
        "77c1119ea0b5cb32287088ceeeb7e3b6bd14a85d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 07:45:13 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 03 07:45:13 2012 -0800"
      },
      "message": "Merge \"No need to check a wp\u003c\u003e for 0 before promote()\""
    },
    {
      "commit": "84afa3b51ac48f84ed62489529ce78cba7fca00e",
      "tree": "ee9ba57cdc17668c9362b70f6bfbfcbd40a253ad",
      "parents": [
        "5c0ad10b14ec2287f90f95912d98e66eef006e2a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jan 25 15:28:08 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 07:37:14 2012 -0800"
      },
      "message": "Constructor initialization and const fields\n\nIn constructors, initialize member fields in the initialization list\nrather than constructor body where possible.  This allows more fields\nto be const, provided they are never modified.\n\nAlso initialize POD fields in constructor, unless it\u0027s obvious they\ndon\u0027t need to be initialized.  In that case, put a comment instead.\n\nRemove explicit clear() in destructors on fields that are now const.\n\nGive AudioSessionRef a default constructor, so it\u0027s immutable fields can\nbe marked const.\n\nAdd comment about ~TrackBase() trick.\n\nInitialize fields in declaration order to make it easier to confirm that\nall fields are set.\n\nMove initialization of mHardwareStatus from onFirstRef() to constructor.\n\nUse NULL not 0 to initialize raw pointers in initialization list.\n\nRename field mClient to mAudioFlingerClient, and getter from client()\nto audioFlingerClient().\n\nChange-Id: Ib36cf6ed32f3cd19003f40a5d84046eb4c122052\n"
    },
    {
      "commit": "5c0ad10b14ec2287f90f95912d98e66eef006e2a",
      "tree": "b11958235c122442a9dd1af28ad054e1e5046a79",
      "parents": [
        "62da7fbd60bee2dd57f503126266e9f04311d400",
        "23bb8becff20449a9b1647d5a1a99b14c83f0cce"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 07:26:28 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 03 07:26:28 2012 -0800"
      },
      "message": "Merge \"Cleanup thread types\""
    },
    {
      "commit": "62da7fbd60bee2dd57f503126266e9f04311d400",
      "tree": "22c9118701f42b77ed573001779390437d96872c",
      "parents": [
        "d45ee9d9d61af0791c7c3c51f8d4fe6794ef02a5",
        "83d86538c4c479a9225c75ab27938e8f05abb9c8"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 07:18:06 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 03 07:18:06 2012 -0800"
      },
      "message": "Merge \"Make AudioTrack control block volume field private\""
    },
    {
      "commit": "d45ee9d9d61af0791c7c3c51f8d4fe6794ef02a5",
      "tree": "c5193c552b2bd0188276e6a2c96a21965f86edbc",
      "parents": [
        "914b33354be650a5213dd545ace49c6e81828043",
        "435dbe6c3ecd04bcb4bd80584064e287ebccd720"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 02 13:31:23 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Feb 02 13:31:23 2012 -0800"
      },
      "message": "Merge \"Fix const sp\u003c\u003e\u0026 in parameter list and return value\""
    },
    {
      "commit": "d05397144be774f2f3623c754e865f51753e4e31",
      "tree": "da598c09f36ce72672b7acec33516dbd9103e172",
      "parents": [
        "fd267d7cf640225bb57f0ed1af44efc153275f6d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 12:56:03 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 13:01:17 2012 -0800"
      },
      "message": "For performance, return large objects by reference\n\nChange-Id: Ibf737018ef1d3c7d717584615dcb2d4ecdb50c99\n"
    },
    {
      "commit": "090f01963e215f895020a31e22368cd44e086ce3",
      "tree": "c00827de791ec3f221faab8effbe822a619a7927",
      "parents": [
        "fd267d7cf640225bb57f0ed1af44efc153275f6d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 13:00:02 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 13:00:02 2012 -0800"
      },
      "message": "Improve performance for sp\u003c\u003e on stack\n\nCombine default constructor for sp\u003c\u003e immediately followed by assignment,\nas the reference-counting is relatively slow.  Also return sp\u003c\u003e directly\nrather than via local variable, for the same reason.\n\nChange-Id: If55931f1e407994f6591ddde41b53db72fb4fc40\n"
    },
    {
      "commit": "435dbe6c3ecd04bcb4bd80584064e287ebccd720",
      "tree": "aa42e717d186dc84491e03c675c8c93683407fcf",
      "parents": [
        "fd267d7cf640225bb57f0ed1af44efc153275f6d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 10:15:48 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 10:31:09 2012 -0800"
      },
      "message": "Fix const sp\u003c\u003e\u0026 in parameter list and return value\n\nEffectModule::addHandle and Client::heap() were declared incorrectly.\n\nAs a parameter, an sp\u003c\u003e should be \u0026 for efficiency, and for input\nparameters it should also be const to protect the caller\u0027s value.\n\nBut as a return value, an sp\u003c\u003e should have neither const or \u0026.  The \"e\"\nin \"return e;\" might be located on the stack, and if there is \"\u0026\" then\nthe caller would see the address of a variable which no longer exists.\nAlso, an \u0026 would make it hard to do \"return 0;\".\nA \"const\" without \u0026 is meaningless in the return type.\n(In this particular case, the \"e\" is a member field, so it was safe.)\n\nChange-Id: I3df5f294214eb15a9d4d596c6d5ef29de97b5c27\n"
    },
    {
      "commit": "e9dd0176933d6233916c84e18f3e8c0d644ca05d",
      "tree": "456651a5f40cbd404d39abb20604817324926db3",
      "parents": [
        "fd267d7cf640225bb57f0ed1af44efc153275f6d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 18:08:45 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 18:08:45 2012 -0800"
      },
      "message": "Unconditional delete\n\nDon\u0027t check that pointer is non-NULL before delete.\n\nDon\u0027t leave deleted member fields non-NULL, except in a destructor,\nsince it could be misleading in a dump or debugger. (mRsmpOutBuffer)\n\nChange-Id: Ic0492a6b752f74a67f4c96dfb89ca2de4e69eecf\n"
    },
    {
      "commit": "77c1119ea0b5cb32287088ceeeb7e3b6bd14a85d",
      "tree": "1468a69506c7e84e2e44924f6244bec7ef8f856d",
      "parents": [
        "fd267d7cf640225bb57f0ed1af44efc153275f6d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jan 25 14:27:41 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 16:30:45 2012 -0800"
      },
      "message": "No need to check a wp\u003c\u003e for 0 before promote()\n\nAlso remove unnecessary wp\u003c\u003e local variable.\n\nChange-Id: I620e67b5d559d28616f8e00609a525cfe19c5ddc\n"
    },
    {
      "commit": "3d2f877c1cb4e4ae4ddde7f57f4353de9341f11b",
      "tree": "02ba1339028105733ff3897c5c72952781dc793d",
      "parents": [
        "a3a2cd4072aaa2d93c91251a786eb7323f8d2c27"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 15:25:25 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 16:01:44 2012 -0800"
      },
      "message": "Use ToneGenerator::tone_type consistently\n\nAlso remove defaults in startToneCommand(), they\u0027re not needed and the\ndefault for tone type was nonsense.\n\nChange-Id: I70fa8cee4f3dbb8c66ceb3719c8d3d2f447f05b9\n"
    },
    {
      "commit": "de9719b3ec71472e6bf75117152176af51d1a515",
      "tree": "d745196f8aa6832a18e380d78ad1bd1eae1e9e8f",
      "parents": [
        "a3a2cd4072aaa2d93c91251a786eb7323f8d2c27"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 12:32:34 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 13:31:54 2012 -0800"
      },
      "message": "Use audio_in_acoustics_t consistently\n\nChange-Id: I0a9dd668fb2e57b1c3ece3190588194974b99062\n"
    },
    {
      "commit": "fd267d7cf640225bb57f0ed1af44efc153275f6d",
      "tree": "c97f1923f3cf143a7a8cd94184335283100c6437",
      "parents": [
        "a3a2cd4072aaa2d93c91251a786eb7323f8d2c27",
        "eba51fb3a361f67a6a64d5a16eba6084fe27d60e"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 09:06:00 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jan 27 09:06:00 2012 -0800"
      },
      "message": "Merge \"Use audio_source_t consistently\""
    },
    {
      "commit": "a3a2cd4072aaa2d93c91251a786eb7323f8d2c27",
      "tree": "188f6115eb45ac32f182d53540c76dae63cf4917",
      "parents": [
        "6f5980b75df837231365d238c1b0d6f386363fbb",
        "aed850d0d3b3c8cf3feaf1438076f33db2a60946"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 07:22:30 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jan 27 07:22:30 2012 -0800"
      },
      "message": "Merge \"AudioStreamIn and AudioStreamOut\""
    },
    {
      "commit": "6f5980b75df837231365d238c1b0d6f386363fbb",
      "tree": "a0e71b7150016bfd7763572c272b11b33aa13985",
      "parents": [
        "28f52c84c22e129063a576e1269a39ae0cc0bfb3",
        "90716c5728b37637b2d0a730a721bfc9fad299e0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 07:19:53 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jan 27 07:19:53 2012 -0800"
      },
      "message": "Merge \"Declare methods in binder opcode order\""
    },
    {
      "commit": "28f52c84c22e129063a576e1269a39ae0cc0bfb3",
      "tree": "c64b35e8b205295cc6f2503bbb8520868e01fc8a",
      "parents": [
        "114c458f2b80a252ec627add1d5fda2093c79068",
        "28243dd563fee1c82f0fff6cc27b5cbf21fa2585"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 07:19:10 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jan 27 07:19:10 2012 -0800"
      },
      "message": "Merge \"Use enum effect_state consistently\""
    },
    {
      "commit": "114c458f2b80a252ec627add1d5fda2093c79068",
      "tree": "3f676423666da814f847dc7944d223cb5a5bbe9c",
      "parents": [
        "37770e47b63038178e1d8bdb9f14785a86e9e858",
        "b853e986caf43408ad95b9014f194aadff385e3c"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 07:18:23 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jan 27 07:18:23 2012 -0800"
      },
      "message": "Merge \"Use enum track_state consistently\""
    },
    {
      "commit": "eba51fb3a361f67a6a64d5a16eba6084fe27d60e",
      "tree": "2d3dc41818d33d596e66486dcf509086b9dde1e0",
      "parents": [
        "80a0d2de0a7db5cdcaf40fe33b14523b65d19423"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 23 13:58:49 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 16:50:19 2012 -0800"
      },
      "message": "Use audio_source_t consistently\n\nWas a mix of audio_source_t, uint8_t, and int.\n\nRelated fixes:\n - fix comments in MediaRecorder.java\n - AudioPolicyService server side was not checking source parameter at\n   all, so if the client wrapper was bypassed, invalid values could be\n   passed into audio HAL\n - JNI android_media_AudioRecord_setup was checking source for positive\n   values, but not negative values. This test is redundant, since already\n   checked at Java and now checked by AudioPolicyService also, but might\n   as well make it correct.\n\nChange-Id: Ie5e25d646dcd59a86d7985aa46cfcb4a1ba64a4a\n"
    },
    {
      "commit": "aed850d0d3b3c8cf3feaf1438076f33db2a60946",
      "tree": "78a7f2a4ce61fc7514fd3c18ac7805c488945407",
      "parents": [
        "2857b47a2731579772c76d46285660972c0ba23d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 09:46:34 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 15:58:07 2012 -0800"
      },
      "message": "AudioStreamIn and AudioStreamOut\n\nThese are immutable, so make the fields const.\ngetOutput() and getInput() methods are now const.\n\nChange-Id: I128246ebd56ea50b3e542be43f2aa1bcb55f1373\n"
    },
    {
      "commit": "23bb8becff20449a9b1647d5a1a99b14c83f0cce",
      "tree": "461647a589f80192679b52f210524c74cce4fb57",
      "parents": [
        "2857b47a2731579772c76d46285660972c0ba23d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 10:38:26 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 15:45:12 2012 -0800"
      },
      "message": "Cleanup thread types\n\nUse type_t instead of int for thread types.\nInitialize ThreadBase::mType in constructor and make it const.\n\nChange-Id: I43d141388b9639e4783c30b97dbda5688bf7555f\n"
    },
    {
      "commit": "90716c5728b37637b2d0a730a721bfc9fad299e0",
      "tree": "5c92855ca40d1de7f6dc5ad14ad16d54b87137c8",
      "parents": [
        "80a0d2de0a7db5cdcaf40fe33b14523b65d19423"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 13:40:12 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 14:34:30 2012 -0800"
      },
      "message": "Declare methods in binder opcode order\n\nThis makes it easier to compare interface and implementation.\n\nChange-Id: Ie060e43dec348902abcf40f5a610cec639d6d0d3\n"
    },
    {
      "commit": "29c23c3aee5ae799b3480dc6876a46c46b019710",
      "tree": "5303f312a95c76fb3df14f22e91a28e6a32f54f8",
      "parents": [
        "2857b47a2731579772c76d46285660972c0ba23d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 13:37:52 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 14:23:47 2012 -0800"
      },
      "message": "Use enum mixer_state consistently\n\nChange-Id: I5b71ed20f939dfc4b98143334b7aa064d282f584\n"
    },
    {
      "commit": "28243dd563fee1c82f0fff6cc27b5cbf21fa2585",
      "tree": "222f107b8674ef82b42328fce2b464134e22e155",
      "parents": [
        "2857b47a2731579772c76d46285660972c0ba23d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 13:43:46 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 14:20:34 2012 -0800"
      },
      "message": "Use enum effect_state consistently\n\nAlso fix indentation\n\nChange-Id: I393ef9e37ffceed5ad4a78df439726ae1fe139df\n"
    },
    {
      "commit": "b853e986caf43408ad95b9014f194aadff385e3c",
      "tree": "88794d079d055901613a34304c2eb4bececd2033",
      "parents": [
        "2857b47a2731579772c76d46285660972c0ba23d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 13:39:18 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 14:13:43 2012 -0800"
      },
      "message": "Use enum track_state consistently\n\nChange-Id: Ie5ebb7befa092e1de1e4df9c6e2d51e6bcfd176a\n"
    },
    {
      "commit": "9365ea9bf2e439b3e71abbabe22ce7382ebc4b3a",
      "tree": "db8f305183b20de93208b81c209ae0440e692579",
      "parents": [
        "5da85aa064f65d1fc90628bd6658ecd307e44725",
        "84e19873fde204d73628ba1b5ca9e3f5778574fa"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Jan 25 08:57:23 2012 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Wed Jan 25 08:57:23 2012 -0800"
      },
      "message": "am 535b0264: am 7eeaf3f0: Merge \"AudioFlinger: refine mixer sleep time logic\" into ics-mr1\n\n* commit \u0027535b0264a4cfa790e549bd9cd09980788f1375f4\u0027:\n  AudioFlinger: refine mixer sleep time logic\n"
    },
    {
      "commit": "84e19873fde204d73628ba1b5ca9e3f5778574fa",
      "tree": "113fb74556ff48132400e936fa7bd77233630429",
      "parents": [
        "7c5aea0a8d9b422999483f96a2566f77ff11abf2",
        "21e4b6ed00e814bffc70895847a4944d7a190020"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jan 24 11:51:50 2012 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Jan 24 11:51:50 2012 -0800"
      },
      "message": "am 7eeaf3f0: Merge \"AudioFlinger: refine mixer sleep time logic\" into ics-mr1\n\n* commit \u00277eeaf3f07aa6fb10639d9f96c1367eb98c3e8839\u0027:\n  AudioFlinger: refine mixer sleep time logic\n"
    },
    {
      "commit": "7c5aea0a8d9b422999483f96a2566f77ff11abf2",
      "tree": "be8c3dc3c8d2a781020eba7fb165c440f81ff38c",
      "parents": [
        "d9f088521782f071fc615df0ebbc80e53e21b2b1",
        "eaa0b5cc2f7723e9b25298126d0dcb48c56d5dac"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jan 24 11:51:47 2012 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Jan 24 11:51:47 2012 -0800"
      },
      "message": "am 41773d46: Merge \"DO NOT MERGE Revert \"Revert \"AudioFlinger: mix track only when really ready (2)\"\"\" into ics-mr1\n\n* commit \u002741773d46556aa47d4322ff89fdaf7d1345c2d1f2\u0027:\n  DO NOT MERGE Revert \"Revert \"AudioFlinger: mix track only when really ready (2)\"\"\n"
    },
    {
      "commit": "21e4b6ed00e814bffc70895847a4944d7a190020",
      "tree": "ff39d6e267fb9ebaa473db578ef3525330d8450d",
      "parents": [
        "eaa0b5cc2f7723e9b25298126d0dcb48c56d5dac"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Jan 23 18:56:59 2012 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Jan 23 18:56:59 2012 -0800"
      },
      "message": "AudioFlinger: refine mixer sleep time logic\n\nWhen an AudioTrack is in underrun state, the AudioFlinger mixer will\nsleep for a short period of time to give the app a chance to fill the\nAudioTrack buffer. If the AudioTrack is still not ready during next mixing round,\nthe mixer will proceed with other tracks.\n\nIf an application keeps a steady underrun condition, the AudioFlinger mixer will\nalternate between ready and not ready states. In the longer term this will cause the\naudio HAL to underrun.\nThere is a mechanism to reduce the sleep period if the mixer is not ready several times in a\nrow but this mechanism is defeated by the alternating ready/not ready conditions.\n\nThe fix consists in only increasing sleep time if the mixer is ready for at least two\nconsecutive times.\n\nIssue 5904527.\n\nChange-Id: Id0139bca9be8c4e425ec6d428515c4d8f718e8c9\n"
    },
    {
      "commit": "eaa0b5cc2f7723e9b25298126d0dcb48c56d5dac",
      "tree": "5c73ae7daf8480e7ce2cc862790332401688931b",
      "parents": [
        "7baf7894bc2f1a62440f381eeb50143f210a5d61"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Jan 23 18:35:10 2012 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Jan 23 18:37:07 2012 -0800"
      },
      "message": "DO NOT MERGE Revert \"Revert \"AudioFlinger: mix track only when really ready (2)\"\"\n\nThis reverts commit b918035d34422a2041b6ec8c09c566bb93345b40.\n\nChange-Id: I093bcfa56ad54a080b930208b6b79169d33581fb\n"
    },
    {
      "commit": "15dfda272eec983508b89fb8bc9ca6f2bb825496",
      "tree": "0c98903df597cd0d08e6a40b1c11b78cde2d6cbd",
      "parents": [
        "a3db30f7c53936a3acb87d2c44807ee2f0cfa16e",
        "7baf7894bc2f1a62440f381eeb50143f210a5d61"
      ],
      "author": {
        "name": "Justin Ho",
        "email": "justinho@google.com",
        "time": "Mon Jan 23 15:13:19 2012 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Mon Jan 23 15:13:19 2012 -0800"
      },
      "message": "am fee5a860: Merge \"DO NOT MERGE Revert \"AudioFlinger: mix track only when really ready (2)\"\" into ics-mr1\n\n* commit \u0027fee5a860a8355cda071ff23644e943414ba7f65d\u0027:\n  DO NOT MERGE Revert \"AudioFlinger: mix track only when really ready (2)\"\n"
    },
    {
      "commit": "7baf7894bc2f1a62440f381eeb50143f210a5d61",
      "tree": "0ddf435e065f725aebbd1a726eb1087f6e5decfb",
      "parents": [
        "2774144fa8283f1a7b43e17a53c97dec0c366dd3"
      ],
      "author": {
        "name": "Justin Ho",
        "email": "justinho@google.com",
        "time": "Mon Jan 23 14:01:15 2012 -0800"
      },
      "committer": {
        "name": "Justin Ho",
        "email": "justinho@google.com",
        "time": "Mon Jan 23 15:02:41 2012 -0800"
      },
      "message": "DO NOT MERGE Revert \"AudioFlinger: mix track only when really ready (2)\"\n\nThis reverts commit 71c4496a9757438afd30b4404824f296f6158a49.\n\nChange-Id: Iff10c49ea728bb10023ddeb50a3b708db770fff2\n"
    },
    {
      "commit": "335787fe43596f38ea2fa50b24c54d0823a3fb1d",
      "tree": "8efb65da6c538ee243e4ac63541f8f815591aa7b",
      "parents": [
        "58f30210ea540b6ce5aa6a46330cd3499483cb97"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 20 17:00:00 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 20 17:12:59 2012 -0800"
      },
      "message": "Remove AudioFlinger dependencies on client\n\nChange-Id: Ibb591e41a3ca5d7015e2b66b98b8fef5f415fb37\n"
    },
    {
      "commit": "83d86538c4c479a9225c75ab27938e8f05abb9c8",
      "tree": "72fdff9fb9bb7e41fe48c41bfed65ab83b64f85f",
      "parents": [
        "58f30210ea540b6ce5aa6a46330cd3499483cb97"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 17 14:39:34 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 20 16:19:59 2012 -0800"
      },
      "message": "Make AudioTrack control block volume field private\n\nThis is part of the process of abstracting the control block\nto make it easier to maintain.\n\nChange-Id: Idb8f461e68dab3bcf268159cc0781651c6fb7094\n"
    },
    {
      "commit": "58f30210ea540b6ce5aa6a46330cd3499483cb97",
      "tree": "8c559ac8ca7892803b62e5e6d6018e9a4f4533a3",
      "parents": [
        "9bf3a2f69bbfa2562664181b779941e776b7e835"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 12 12:27:51 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 20 14:41:34 2012 -0800"
      },
      "message": "Use audio_format_t consistently, continued\n\nWas int or uint32_t.\n\nWhen AudioFlinger::format can\u0027t determine the correct format,\nreturn INVALID rather than DEFAULT.\n\nInit mFormat to INVALID rather than DEFAULT in the constructor.\nSubclass constructors will set mFormat to the correct value.\n\nChange-Id: I9b62640aa107d24d2d27925f5563d0d7407d1b73\n"
    },
    {
      "commit": "d967f0a099db2b71597a3127134afd4a46287a4a",
      "tree": "6428f1e6df83934c1ae6b46c10d6ee19cfe35c6a",
      "parents": [
        "05bfe50e13793404a78c20c850d467d17734d496",
        "7fc9a6fdf146ded90b51c52f4a05d797294dcb85"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 20 12:14:32 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jan 20 12:14:32 2012 -0800"
      },
      "message": "Merge \"Remove redundant get()\""
    }
  ],
  "next": "7fc9a6fdf146ded90b51c52f4a05d797294dcb85"
}
