)]}'
{
  "log": [
    {
      "commit": "c455fe9727d361076b7cead3efdac2d32a1a1d6d",
      "tree": "10f603fdaeb746bdb00bc43e567751109783db0a",
      "parents": [
        "8b20e9272d2f8d5160494de3212d66a399b3637f"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 29 07:07:30 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 29 11:36:54 2012 -0800"
      },
      "message": "mSuspend comments and usage\n\nEmphasize that playbackthread::mSuspend is a counter, not a bool\n\nChange-Id: I7188e56814e1c54dbc65e560f3627f138257d644\n"
    },
    {
      "commit": "688a64030834ea2f52cc9765676ddf6aa34df767",
      "tree": "dbe70440330e69300fab019f9b90585e025e5c10",
      "parents": [
        "a3873833d518e032138cf70188b6f33cd7acec3d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 29 07:57:06 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 29 09:38:15 2012 -0800"
      },
      "message": "Mark similar and different sections in threadLoop\n\nMost of these comments will be removed after the threadLoop merge.\n\nNote: the trivial change in assignments to mixBufferSize, and the\ncomments about \"tracks to remove\" is to make them all identical.\n\nChange-Id: I3b1a33a7f2cd12ad557a1986bb71f6171161974a\n"
    },
    {
      "commit": "a3873833d518e032138cf70188b6f33cd7acec3d",
      "tree": "2a51dc4f5028548e2217d079c595f925af7968ac",
      "parents": [
        "3e9c3a1d34960cd258f294d31135ab6bf76179d5",
        "04743e99e71c0da012508c7119f414027654ee94"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 07:23:42 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 28 07:23:42 2012 -0800"
      },
      "message": "Merge \"Unlock effect chains in the middle of two if\u0027s\""
    },
    {
      "commit": "3e9c3a1d34960cd258f294d31135ab6bf76179d5",
      "tree": "c4fdfd452a5249202c38bdd5fa06acc94af31402",
      "parents": [
        "a17c820c556fddf7ddd96b82b3e9874e340ffafd",
        "a3b09254d44cd8d66ec947abe547538c4cfeaa89"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 07:21:51 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 28 07:21:51 2012 -0800"
      },
      "message": "Merge \"Simplify removeNotificationClient\""
    },
    {
      "commit": "a17c820c556fddf7ddd96b82b3e9874e340ffafd",
      "tree": "410130682b9d03614ce01e3e5af6bb0a2073d25d",
      "parents": [
        "3f791be1032e6c4cc499598dd2be116db6fb33c3",
        "02fe1bf923bbe5789202dbd5810e2c04794562e6"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 07:21:09 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 28 07:21:09 2012 -0800"
      },
      "message": "Merge \"AudioFlinger const methods and parameters\""
    },
    {
      "commit": "cfbd62616ab2b12f0fee603658f04e5827cc7f8f",
      "tree": "0f3328716fdd788e603a52cc7e8cf80550a406bf",
      "parents": [
        "fadb2c73fce479205432652530663e1e90fd546c",
        "b6b740629c9f11535086e744465bada03f26df11"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 07:18:27 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 28 07:18:27 2012 -0800"
      },
      "message": "Merge \"Fix theoretical race condition in addOutputTrack\""
    },
    {
      "commit": "fadb2c73fce479205432652530663e1e90fd546c",
      "tree": "255d5dc9cdbda67837cbb3a7907ecd797f6b305f",
      "parents": [
        "77f70f7de1977d7b0a9f9c37a25e34db16feb7b4",
        "01c4ebf6b794493898114a502ed36de13137f7e5"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 07:17:47 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 28 07:17:47 2012 -0800"
      },
      "message": "Merge \"AudioBufferProvider comments and cleanup\""
    },
    {
      "commit": "843a12d146bd64642bf85a4e56c274246e3893a6",
      "tree": "82aca30fbbcc5c40f41a75dc3205ce983c187059",
      "parents": [
        "acb364073e62acddced517f2edfe0326245b2af9",
        "8abf44d2f2bcd20a2835570efe89d89c19db426a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Feb 27 13:23:51 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Feb 27 13:23:51 2012 -0800"
      },
      "message": "Merge \"Fix tracking of hardware state for dump\""
    },
    {
      "commit": "df712ea86e6350f7005a02ab0e1c60c28a343ed0",
      "tree": "75401d5ef563d1ae76aaae4965f65bb39f92736c",
      "parents": [
        "d3393c35259588e8ad61a43d1d1aa1568e943307"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Sat Feb 25 18:48:35 2012 -0800"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon Feb 27 13:03:08 2012 -0800"
      },
      "message": "fix libgui header location\n\nChange-Id: Iec71706cdd4f29c6904993648ce873e83ef9cafe\n"
    },
    {
      "commit": "e628d515888baadba75442128678e747e930ed58",
      "tree": "008e72b199be7b6fa0d86f308edb183df3851fe1",
      "parents": [
        "d3cee0b1f77baa4fb7a049eb757e9f5006890726",
        "c0b52836d07f823732f0ff98ca5ca9d7f5730cb8"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Feb 27 07:24:46 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Feb 27 07:24:46 2012 -0800"
      },
      "message": "Merge \"Make threadLoop() logs identical\""
    },
    {
      "commit": "d3cee0b1f77baa4fb7a049eb757e9f5006890726",
      "tree": "6692b5674e5c0285cc28aa2d2753a0c787e0a9cb",
      "parents": [
        "1843df5b4f8f8f8394a96bcaeb5836d720ae9cf5",
        "5d4eeeaf76ebe177b43e87b2a9df5e55e39021f0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Feb 27 07:21:00 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Feb 27 07:21:00 2012 -0800"
      },
      "message": "Merge \"Move declaration of mixerStatus to inner block\""
    },
    {
      "commit": "1843df5b4f8f8f8394a96bcaeb5836d720ae9cf5",
      "tree": "c2be52b9aec3d9a84fbf44059aa86f233275141f",
      "parents": [
        "37d825e72a6c606553a745da1212590a425996d3",
        "9eeafeb52fecf90882e9b44eeefcb7c3e16aa915"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri Feb 24 19:08:12 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 24 19:08:12 2012 -0800"
      },
      "message": "Merge \"remove dependency on android_native{s_priv|buffer}.h\""
    },
    {
      "commit": "9eeafeb52fecf90882e9b44eeefcb7c3e16aa915",
      "tree": "0a09b02937d7097e042367163fbe4c9d4b5b2230",
      "parents": [
        "5ce96d97feafc6989f6141bb2633eae3d87ddf28"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri Feb 24 18:25:41 2012 -0800"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri Feb 24 18:26:01 2012 -0800"
      },
      "message": "remove dependency on android_native{s_priv|buffer}.h\n\nChange-Id: Ie4b95f7061c240f37c504414259f92d72c4ffc89\n"
    },
    {
      "commit": "a3b09254d44cd8d66ec947abe547538c4cfeaa89",
      "tree": "9a21a4b2b34e264d71f4a44262e5f555ce9513d6",
      "parents": [
        "37d825e72a6c606553a745da1212590a425996d3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 20 09:19:01 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 17:00:30 2012 -0800"
      },
      "message": "Simplify removeNotificationClient\n\nNo need to check for presence of item before removing\n(but we do lose the log of the previous value).\n\nChange-Id: I2838430824de5f257f2ee15db0c22b1920c67d08\n"
    },
    {
      "commit": "02fe1bf923bbe5789202dbd5810e2c04794562e6",
      "tree": "0a3c1634d0e3b36e996a9be60540bf63b226f84e",
      "parents": [
        "37d825e72a6c606553a745da1212590a425996d3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 15:42:17 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 16:34:43 2012 -0800"
      },
      "message": "AudioFlinger const methods and parameters\n\nChange-Id: I93ec28024005ed23aa141518092a012a4a7c44c5\n"
    },
    {
      "commit": "c0b52836d07f823732f0ff98ca5ca9d7f5730cb8",
      "tree": "458884704d091098a8b44fceab1c5d9daa0e362d",
      "parents": [
        "37d825e72a6c606553a745da1212590a425996d3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 11:18:09 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 16:26:07 2012 -0800"
      },
      "message": "Make threadLoop() logs identical\n\nChange the wording of the logs in the various copies of threadLoop()\nto be identical.  This will make it easier to merge them soon.\n\nChange-Id: Idfa181e437738712c784dc7f746cac79f83d2931\n"
    },
    {
      "commit": "5d4eeeaf76ebe177b43e87b2a9df5e55e39021f0",
      "tree": "f27b737f2e5dad2ac6c04ae0294f121a47210aec",
      "parents": [
        "d6fd85a157ce2054b2304e6d171fa87ae09c363d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 07:25:40 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 16:14:46 2012 -0800"
      },
      "message": "Move declaration of mixerStatus to inner block\n\nmixerStatus was being declared (and initialized) too early,\nwhich also resulted in a duplicate initialization.  Moved\nthe declaration into the block where it is actually used.\n\nChange-Id: Ifdcfefe362a5efe3493dd616cdb44645c6f9aed5\n"
    },
    {
      "commit": "37d825e72a6c606553a745da1212590a425996d3",
      "tree": "268310fe31b44c0eee84b1d91adfbbaff2103a76",
      "parents": [
        "5ce96d97feafc6989f6141bb2633eae3d87ddf28"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 07:21:48 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 16:02:24 2012 -0800"
      },
      "message": "Pull out duplicated copies of silent mode check\n\nAlso fix the error handling for the property_get.\n\nThis is part of preparation for the threadLoop() merge.\n\nChange-Id: I6405190ea18146d1271575e1dfe9f279e8f36b17\n"
    },
    {
      "commit": "04743e99e71c0da012508c7119f414027654ee94",
      "tree": "01efb09ba3b56687256ad81564092c7f92d9186f",
      "parents": [
        "d6fd85a157ce2054b2304e6d171fa87ae09c363d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 11:20:09 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 15:55:08 2012 -0800"
      },
      "message": "Unlock effect chains in the middle of two if\u0027s\n\nAs part of the upcoming threadLoop() merge, this CL makes it clearer\nwhat are the similar and different parts before and after unlocking\neffect chains.\n\nIn each threadLoop(), the old code was:\n\n    if (sleepTime \u003d\u003d 0) {\n        // A\n        unlockEffectChains(effectChains);\n        // B\n    } else {\n        unlockEffectChains(effectChains);\n        // C\n    }\n\nThe new code is:\n\n    if (sleepTime \u003d\u003d 0) {\n        // A\n    }\n    unlockEffectChains(effectChains);\n    if (sleepTime \u003d\u003d 0) {\n        // B\n    } else {\n        // C\n    }\n\nAlso this is slightly slower by one \"if\", it has the advantage of making\nit much more obvious about what is done before and after the unlock,\nand also to see the similarities and differences among the various\ncopies of threadLoop().\n\nChange-Id: I7bf4369d2dcb072573ec43b7e52c637f0097dc00\n"
    },
    {
      "commit": "5ce96d97feafc6989f6141bb2633eae3d87ddf28",
      "tree": "4a38a92123c13a19107d0b73d8ec877f50e87011",
      "parents": [
        "7fb5e8832f582ec515550696e9dabc3a8d9de14d",
        "83efdd0fc08cd5aedf50b45741a8a87be8dc4b41"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 14:25:15 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 24 14:25:15 2012 -0800"
      },
      "message": "Merge \"Pull CPU statistics code out of threadLoop()\""
    },
    {
      "commit": "b6b740629c9f11535086e744465bada03f26df11",
      "tree": "7561f2281d6fbe6b59a71470b1432e8f90e80391",
      "parents": [
        "d6fd85a157ce2054b2304e6d171fa87ae09c363d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 14:12:20 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 14:20:29 2012 -0800"
      },
      "message": "Fix theoretical race condition in addOutputTrack\n\nThis is not a real race, because addOutputTrack was only called in two\nplaces, and in both places there could be no other threads referencing\nthe DuplicatingThread instance.\n\nThose two places are:\n - the DuplicatingThread constructor, which is of course safe\n - openDuplicateOutput - this is safe because it\u0027s called immediately\n   after the new DuplicatingThread, and there are no sp\u003c\u003e either in the\n   constructor or here which could cause onFirstRef() to do Thread::run().\n\nBut for safety in case addOutputTrack is ever called somewhere else,\nor there are sp\u003c\u003e created earlier, it is safer to take the thread lock.\n\nChange-Id: I1502d014fa37ec5dbf4bf40d3e2884af311cd5e9\n"
    },
    {
      "commit": "83efdd0fc08cd5aedf50b45741a8a87be8dc4b41",
      "tree": "7e87220c4ea29345be9fd7a6c041bf58dc9f816f",
      "parents": [
        "d6fd85a157ce2054b2304e6d171fa87ae09c363d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 07:21:32 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 13:56:12 2012 -0800"
      },
      "message": "Pull CPU statistics code out of threadLoop()\n\nThis is to prepare for the threadLoop() merge\n\nChange-Id: I118c7d5c6b011b5d5b95ec7d63fb03feb166a9cf\n"
    },
    {
      "commit": "01c4ebf6b794493898114a502ed36de13137f7e5",
      "tree": "7f663fdad4040a40411e79d837c14e52e11a65b9",
      "parents": [
        "d6fd85a157ce2054b2304e6d171fa87ae09c363d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 22 10:47:35 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 13:42:13 2012 -0800"
      },
      "message": "AudioBufferProvider comments and cleanup\n\nAdd comments about which methods implement the AudioBufferProvider interface.\n\nSimplified the definition of kInvalidPts.  \u003cstdint.h\u003e is very hard to work\nwith, there seems to be no way to use it reliably to get INT64_MAX without\nhaving a separate source file, which is ugly because it means kInvalidPts\nis not a compile-time constant.  So I just deleted AudioBufferProvider.cpp\nand used a hard-coded constant instead.\n\nAdded a default constructor for Buffer so that the fields aren\u0027t random\n(especially .raw which is used to determine if the buffer is valid).\n\nMake the pts for getNextBuffer default to kInvalidPTS so code that\ndoesn\u0027t need a pts doesn\u0027t have to specify a value.\n\nRename the parameter to AudioMixer::setBufferProvider to make it clearer.\n\nChange-Id: I87e7290884d4ed975b019f62d1ab6ae2bc5065a5\n"
    },
    {
      "commit": "8abf44d2f2bcd20a2835570efe89d89c19db426a",
      "tree": "29fc684b04d18621913145c807c4493f5b607d86",
      "parents": [
        "d6fd85a157ce2054b2304e6d171fa87ae09c363d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 02 14:16:03 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 13:31:26 2012 -0800"
      },
      "message": "Fix tracking of hardware state for dump\n\nAt end of AudioFlinger::onFirstRef(), the hardware status was being left\nin wrong state.  It should be AUDIO_HW_IDLE but was AUDIO_HW_INIT.\n\nmHardwareStatus was being set to AUDIO_HW_OUTPUT_OPEN too early, and so\na return would leave it in the wrong state until next hardware operation.\n\nTake the hardware lock for dev-\u003eget_parameters, and update mHardwareStatus\nbefore and after.\n\nKeep hardware lock only for the duration of the dev-\u003eset_parameters.\n\nRename two constants in enum hardware_call_state to have the prefix\nAUDIO_HW so they follow the naming conventions.\n\nAdd comments.\n\nChange-Id: I6c7450b11f9b13adaeef9cec874333e478a58fc0\n"
    },
    {
      "commit": "5cf034d92d901169ca6e36c90475f40715827fcd",
      "tree": "7a6d8c982f699f2e8a8ea0cfd0088dfdada23399",
      "parents": [
        "d6fd85a157ce2054b2304e6d171fa87ae09c363d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 21 10:35:56 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 13:14:28 2012 -0800"
      },
      "message": "Remove TrackBase::mFlags\n\nThe bit-field TrackBase::mFlags was supposed to have track-specific\nflags in the upper 16 bits, and system flags in the lower 16 bits.\n\nThe upper 16 bits of mFlags were initialized in the TrackBase\nconstructor from the flags parameter of IAudioFlinger::createTrack()\nand IAudioFlinger::openRecord(), and the lower 16 bits were cleared.\n\nHowever, the upper 16 bits of mFlags were never acccessed again.\nSo really there are no track-specific flags.  I left the flags\nin the parameter list of createTrack() and openRecord() but made a\nnote that these should be removed eventually as they are dead.\n\nThis leaves only the one system flag \"step server failed\".  I replaced\nthe bit-field mFlags by bool mStepServerFailed, which is simpler and\nslightly faster.\n\nChange-Id: I6650f5487be72791b4a67d73adcd10ffa04e2aa5\n"
    },
    {
      "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"
    }
  ],
  "next": "3d2f877c1cb4e4ae4ddde7f57f4353de9341f11b"
}
