)]}'
{
  "log": [
    {
      "commit": "a934c2cd2de781d79f4f8d556b99b8ebaf146488",
      "tree": "58765382e3074b51807c7cabe6bcc2c76d8c4694",
      "parents": [
        "a8719ad9d53d3fe51e8031b2471e9558b8ef727f"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jan 04 11:02:33 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 06 13:29:47 2012 -0800"
      },
      "message": "Use correct type for hardware call state\n\nChange-Id: Ic6d98b129e3ec653df1d8f7e829adf8dccb4f378\n"
    },
    {
      "commit": "a8719ad9d53d3fe51e8031b2471e9558b8ef727f",
      "tree": "b64e560b500236cbe7f9f31b26a5c5f2032373e7",
      "parents": [
        "9a03482c66b2f5c30c7fde38216239a1f233df02",
        "e80a4ccd2bac7bf121441e257044f5813e85180f"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 05 07:38:29 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Jan 05 07:38:29 2012 -0800"
      },
      "message": "Merge \"Use the standard CC_LIKELY and CC_UNLIKELY macros\""
    },
    {
      "commit": "e80a4ccd2bac7bf121441e257044f5813e85180f",
      "tree": "795c33992f702be01aac2ffbfb652408168d9b26",
      "parents": [
        "7c48707a9d320230452d5937239f28ab0ea2e695"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 15 09:51:17 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 05 07:33:45 2012 -0800"
      },
      "message": "Use the standard CC_LIKELY and CC_UNLIKELY macros\n\nSeveral source files privately defined macros LIKELY and UNLIKELY in terms\nof __builtin_expect. But \u003ccutils/compiler.h\u003e already has CC_LIKELY and\nCC_UNLIKELY which are intended for this purpose.  So rename the private\nuses to use the standard names.\n\nIn addition, AudioFlinger was relying on the macro expanding to extra ( ).\n\nChange-Id: I2494e087a0c0cac0ac998335f5e9c8ad02955873\n"
    },
    {
      "commit": "dc8627e7dcd019ec328878b1f7855890d39ed0ab",
      "tree": "bdeeece3bdad99f55c8bdcd53fb901c22ef18fb8",
      "parents": [
        "157fea642cb4c10e44a61f932c68f7c3a2610a81",
        "1a4b99396d7d4c7cf0b9a3acc56807532064be90"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Jan 04 17:39:12 2012 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Jan 04 17:39:12 2012 -0800"
      },
      "message": "resolved conflicts for merge of 1a4b9939 to master\n\nChange-Id: I0c910d391a38a916d8431f7d1f5b82e39e1a66c2\n"
    },
    {
      "commit": "5baa3a62a97544669fba6d65a11c07f252e654dd",
      "tree": "109755e1595b438873d34b981e31f84ea64bd2a5",
      "parents": [
        "173ab4d61077c49f115b82eff34f97fda5a7273a"
      ],
      "author": {
        "name": "Steve Block",
        "email": "steveblock@google.com",
        "time": "Tue Dec 20 16:23:08 2011 +0000"
      },
      "committer": {
        "name": "Steve Block",
        "email": "steveblock@google.com",
        "time": "Tue Jan 03 22:38:27 2012 +0000"
      },
      "message": "Rename (IF_)LOGD(_IF) to (IF_)ALOGD(_IF)  DO NOT MERGE\n\nSee https://android-git.corp.google.com/g/156016\n\nBug: 5449033\nChange-Id: I4c4e33bb9df3e39e11cd985e193e6fbab4635298\n"
    },
    {
      "commit": "72dafb20e036b8844775e3456e5d06a8a8a2cd50",
      "tree": "88d825ec88c2475b0d36617545f6f20bbdfaa1fd",
      "parents": [
        "c892e177c4f7a41e910c70f68d4e213589da1396"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Dec 22 16:08:41 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Dec 22 16:08:41 2011 -0800"
      },
      "message": "audioflinger: fix clicks on 48kHz audio.\n\nThe calculation done in prepareTracks_l() for the minimum amount\noff frames needed to mix one output buffer had 2 issues:\n- the additional sample needed for interpolation was not included\n- the fact that the resampler does not acknowledge the frames consumed\nimmediately after each mixing round but only once all frames requested have been used\nwas not taken into account.\nThus the number of frames available in track buffer could be considered sufficient although\nit was not and the resampler would abort producing a short silence perceived as a click.\n\nIssue 5727099.\n\nChange-Id: I7419847a7474c7d9f9170bedd0a636132262142c\n"
    },
    {
      "commit": "0ca16d6ba6a2e952bf39961abd7c6f720871ef01",
      "tree": "c7cca6ec6f778920ec8d613bb6d8da9e7616aecc",
      "parents": [
        "5f45cbac03aef1aaa4e6947c3a1188768343686a",
        "4abf88244b73e80df5901d4e7508f879d80758c2"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Dec 19 17:26:24 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Dec 19 17:26:24 2011 -0800"
      },
      "message": "Merge \"audio effects: rename configure command\""
    },
    {
      "commit": "4abf88244b73e80df5901d4e7508f879d80758c2",
      "tree": "d24cb14b8e572f83816a10072dd699b32e38c19a",
      "parents": [
        "51a0e745ee29aa90e2c8c3d7c7bdc083bdc0028d"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Dec 16 15:30:36 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Dec 19 17:08:31 2011 -0800"
      },
      "message": "audio effects: rename configure command\n\nRenamed audio effect library interface command for audio format\nconfiguration from EFFECT_CMD_CONFIGURE to EFFECT_CMD_SET_CONFIG.\nThis makes the naming more consistent with other exixsting commands\nand allow adding a new command to get the configuration (EFFECT_CMD_GET_CONFIG).\nSame change for reverse channel configuration renamed from\nEFFECT_CMD_CONFIGURE_REVERSE to EFFECT_CMD_SET_CONFIG_REVERSE.\n\nImplemented EFFECT_CMD_GET_CONFIG in exisitng effect libraries.\n\nChange-Id: Ia7b1c620f13797fe5aceb3b0b4acbacce09fb067\n"
    },
    {
      "commit": "d9de2d21efd4679f17ff1b25081f0462649810e4",
      "tree": "b077deff2348c9fecc73fcf00571f2ac063a7567",
      "parents": [
        "1b678528237d4eea623840ce3ba5520c59ca4b2c",
        "490909d2c057f348c0a6c69e5e6e9ab48fa8ea07"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Dec 16 15:02:30 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Dec 16 15:02:30 2011 -0800"
      },
      "message": "Merge \"Extract out audio DSP code to utility library\""
    },
    {
      "commit": "490909d2c057f348c0a6c69e5e6e9ab48fa8ea07",
      "tree": "c5680d3ec13e6a47f27d4892982de0aeffaaf807",
      "parents": [
        "e61fd281a8cb69ae45c5de4b160ab86226083152"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 15 09:52:39 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Dec 16 11:42:03 2011 -0800"
      },
      "message": "Extract out audio DSP code to utility library\n\nChange-Id: Ib8ce72028a7ea30e82baa518e381370e820ebbd0\n"
    },
    {
      "commit": "844756be54681dd96b822558b136367e459e5e6a",
      "tree": "a35903be8464f32985eab0bc9cc5b68ad85c53c5",
      "parents": [
        "0904c203c4c56e43f723522351b7a3bc304196ef",
        "af62dbca028583a95703c1305e2bcc050cdcb93f"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Dec 16 07:29:57 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Dec 16 07:29:57 2011 -0800"
      },
      "message": "Merge \"Simplify enable/disable mixing\""
    },
    {
      "commit": "cf45596da384b8712342f72bac506a179f8c0b4f",
      "tree": "b2c18edd2d995911c941d093c76cab8ddb9658c8",
      "parents": [
        "2efd1184f9c67eaebf68a5125232fcc2adb56387",
        "4b220f0a7b153901741e6a155c296730e0d547e1"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 15 16:17:04 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Dec 15 16:17:04 2011 -0800"
      },
      "message": "Merge \"Improve resistance to leaks for ConfigEvent\""
    },
    {
      "commit": "2efd1184f9c67eaebf68a5125232fcc2adb56387",
      "tree": "d077aa49f3d57db7193df83457de7bccefee7195",
      "parents": [
        "f15974a37f87e32eedc9005ab8a8be6e7a1d72b0",
        "c434c90cc28fc4bf724aa618f9631822a6bd9a0c"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 15 16:16:55 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Dec 15 16:16:55 2011 -0800"
      },
      "message": "Merge \"Use NULL not 0 for pointers\""
    },
    {
      "commit": "af62dbca028583a95703c1305e2bcc050cdcb93f",
      "tree": "9d3f5981853f1266a404121c74bddcf6d6ed9cae",
      "parents": [
        "e61fd281a8cb69ae45c5de4b160ab86226083152"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 15 14:54:01 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 15 15:00:28 2011 -0800"
      },
      "message": "Simplify enable/disable mixing\n\nThe MIXING enum isn\u0027t needed, and now returns void instead of status_t.\n\nChange-Id: Ibe4ec24081d75ad4ab78b9c7191fc9077959c4e9\n"
    },
    {
      "commit": "4b220f0a7b153901741e6a155c296730e0d547e1",
      "tree": "f5dbffeb63ace4d15249e773809d7e17b93180aa",
      "parents": [
        "e61fd281a8cb69ae45c5de4b160ab86226083152"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Dec 13 11:50:00 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 15 12:51:52 2011 -0800"
      },
      "message": "Improve resistance to leaks for ConfigEvent\n\nA Vector of pointers is risky, as there is no ownership (and the\nThreadBase destructor was not deleting them, so if there were any left\nover at end it would leak).  Replaced by a Vector of values.\n\nChange-Id: Iddde72dc30134adfcf724dec26cbe0a742509b8c\n"
    },
    {
      "commit": "c434c90cc28fc4bf724aa618f9631822a6bd9a0c",
      "tree": "27a33e92a1a2c5f5f8068535cbe3f8bdf1bed405",
      "parents": [
        "e61fd281a8cb69ae45c5de4b160ab86226083152"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Dec 13 11:53:26 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 15 09:18:17 2011 -0800"
      },
      "message": "Use NULL not 0 for pointers\n\nChange-Id: Iab3f9abbdab617dc5a599e657ec46a0b0a002eef\n"
    },
    {
      "commit": "25adf474775acb3eea260cb0a6251cf43ff798ce",
      "tree": "0acebea1cd8c893c31030364ce9aa46e4f3865be",
      "parents": [
        "927cc6c7e8765c3b8b1e18e7105c9e5312a475c8",
        "fb2ab9efc3805c81521afb9ff91a58ff5097a36e"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 17:35:36 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Dec 14 17:35:36 2011 -0800"
      },
      "message": "Merge \"Fix indentation and whitespace\""
    },
    {
      "commit": "927cc6c7e8765c3b8b1e18e7105c9e5312a475c8",
      "tree": "d099b494646f426e1fecf976fb65f50117cc5ade",
      "parents": [
        "a55d4f9dab9efc56836ab5fe54af8ce167868ad7",
        "9818a9da598f9fbf731f9d894838c26c9b9152f4"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 17:35:23 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Dec 14 17:35:24 2011 -0800"
      },
      "message": "Merge \"Improve AudioFlinger error logging\""
    },
    {
      "commit": "9818a9da598f9fbf731f9d894838c26c9b9152f4",
      "tree": "a1a54450a31b040dabb78b445e733faacfd0e2d2",
      "parents": [
        "e61fd281a8cb69ae45c5de4b160ab86226083152"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Oct 28 10:31:42 2011 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 17:22:40 2011 -0800"
      },
      "message": "Improve AudioFlinger error logging\n\nChange-Id: I8ce9aff4038cd7fa0067600faa8080b137db1939\n"
    },
    {
      "commit": "da7923ac2932769e6d64508376a449c9dcd2889e",
      "tree": "2bd291deca16fde48bcf5d1b1494c0531464cf64",
      "parents": [
        "377d4ae5cbb5304d3bae11a511bd51e2c58db236",
        "e5fb263a3625c0e6b4a9aefa86067bb9463dd06d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 16:56:31 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Dec 14 16:56:31 2011 -0800"
      },
      "message": "Merge \"Audio C++ comments\""
    },
    {
      "commit": "fb2ab9efc3805c81521afb9ff91a58ff5097a36e",
      "tree": "a115dd527ef2256f39677fb990531f506cbeeb34",
      "parents": [
        "e61fd281a8cb69ae45c5de4b160ab86226083152"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Dec 12 09:05:55 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 16:54:05 2011 -0800"
      },
      "message": "Fix indentation and whitespace\n\nUse git diff -w to verify.\n\nChange-Id: Ib65be0a1ecf65d6cad516110604e3855bf68a638\n"
    },
    {
      "commit": "3e62a5bd8c488284572f78c3b49e3240eb6532bc",
      "tree": "2227f4d5528ed1136e8841bbe172b5b0268f8062",
      "parents": [
        "478e37d60cebb9f1ae63a68a78d58a141f312eb2",
        "62de3db2d6adb4e7cc5dc8a37d17ad456973a1d9"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 15:40:35 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Dec 14 15:40:35 2011 -0800"
      },
      "message": "Merge \"Use const char correctly in AudioFlinger\""
    },
    {
      "commit": "478e37d60cebb9f1ae63a68a78d58a141f312eb2",
      "tree": "c45747058ad4622563f08f02b347817f3fc612a4",
      "parents": [
        "ef2b0caf533d09404e7f593ee3067e5f90c84427",
        "cbfe2e1d5292a31efb7b2bf87af985199aee943a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 15:40:27 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Dec 14 15:40:27 2011 -0800"
      },
      "message": "Merge \"Use units after all times\""
    },
    {
      "commit": "e5fb263a3625c0e6b4a9aefa86067bb9463dd06d",
      "tree": "bceb757165943cf03d96906b595c4b24bfde4218",
      "parents": [
        "e61fd281a8cb69ae45c5de4b160ab86226083152"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 10:28:06 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 14:38:26 2011 -0800"
      },
      "message": "Audio C++ comments\n\nChange-Id: I84906ebb9dfcfa5b96b287d18364b407f02a30c1\n"
    },
    {
      "commit": "51e445f701b2173c44db70d5af0861351b6f69b9",
      "tree": "c229212da605fe99e9b9cd8c9148c375f2ae5d74",
      "parents": [
        "e61fd281a8cb69ae45c5de4b160ab86226083152"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Dec 13 11:23:47 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 13:31:40 2011 -0800"
      },
      "message": "Remove redundant clear()\n\nChange-Id: Ie5e4e63cbc8fa85ef50451dddf8f149fa864b132\n"
    },
    {
      "commit": "62de3db2d6adb4e7cc5dc8a37d17ad456973a1d9",
      "tree": "25d0228bc044fa10bad9d96fb463dfb68a42ba26",
      "parents": [
        "e61fd281a8cb69ae45c5de4b160ab86226083152"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Dec 12 09:04:45 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 13:14:22 2011 -0800"
      },
      "message": "Use const char correctly in AudioFlinger\n\nUse const char [] instead of const char * to eliminate unnecessary pointer.\nMake the array audio_interfaces also const, in addition to the strings.\n\nChange-Id: I31f33d1dcb9a657ee136f4280fd2d46492496831\n"
    },
    {
      "commit": "cbfe2e1d5292a31efb7b2bf87af985199aee943a",
      "tree": "8d8b9f578fc54d24f70389c57520a15188fca539",
      "parents": [
        "e61fd281a8cb69ae45c5de4b160ab86226083152"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Dec 13 11:04:14 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 14 09:42:18 2011 -0800"
      },
      "message": "Use units after all times\n\nChange-Id: I48d3f29c37228b5d03189e4c9600824c9360cac9\n"
    },
    {
      "commit": "53c52895beba034f175500decedf7cb0c910078f",
      "tree": "00304f762bf1839d213928f957ada1e38cb70452",
      "parents": [
        "e7851ea6121bf8c6d89f16c27a5c704f8e8a5c59",
        "5433e25f6ce013860ff2a074ad8d1158cc39ab91"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Dec 05 17:25:37 2011 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Mon Dec 05 17:25:37 2011 -0800"
      },
      "message": "am 5433e25f: am 7b6aff23: Merge \"audioflinger: fix audio skipping over A2DP\" into ics-mr1\n\n* commit \u00275433e25f6ce013860ff2a074ad8d1158cc39ab91\u0027:\n  audioflinger: fix audio skipping over A2DP\n"
    },
    {
      "commit": "4433169a64eddb8598735bd950491ed35ad9c5f8",
      "tree": "0af1c5609ff4233ecfad3820200aac096b2ffeeb",
      "parents": [
        "e35581ad5ad635f9dcfe4ab6a432c48b46b782cd"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Dec 05 09:47:19 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Dec 05 10:40:18 2011 -0800"
      },
      "message": "audioflinger: fix audio skipping over A2DP\n\nThe maximum sleep time allowed in the mixer thread when audio tracks\nare enabled but not ready for mixing is derived from the latency\nreported by the output stream.\nThis does not work for A2DP where the latency also reflects encoding, decoding\nand transfer time.\n\nModified activeSleepTimeUs() to take A2DP case into account.\n\nIssue 5682206.\n\nChange-Id: I3784ac01fb6f836b5a6ce6f764fb15347586de35\n"
    },
    {
      "commit": "08e74ba8b05573d0acddc51d09a2554b29a62dbc",
      "tree": "af370652377c2f0736a2045fdcd4dc515c50235b",
      "parents": [
        "4b057934e79584313870279bdd15ac2e2b520018",
        "f6422f5f5d04aab47f8f36a0ea92e2140bed0105"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Nov 23 12:35:01 2011 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Wed Nov 23 12:35:01 2011 -0800"
      },
      "message": "am f6422f5f: am 20398fac: Merge \"audioflinger: reduce sleep time to avoid underrun\" into ics-mr1\n\n* commit \u0027f6422f5f5d04aab47f8f36a0ea92e2140bed0105\u0027:\n  audioflinger: reduce sleep time to avoid underrun\n"
    },
    {
      "commit": "f1f5fc85b07fe74cfa12789fefa126cac7a499a9",
      "tree": "747ded89a6c7366e2f809ecd8e2e43d5c9edcbc4",
      "parents": [
        "7257a32b9ac7cbbb47659ed7bea4ab47e74ac3ec"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Nov 22 18:50:29 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Nov 22 18:50:29 2011 -0800"
      },
      "message": "audioflinger: reduce sleep time to avoid underrun\n\nProgressively reduce the sleep time applied in MixerThread::threadLoop()\nin case of consecutive application underruns to avoid starving the audio HAL.\nAs the default sleep time is longer than the duration of an audio buffer\nwe ended up writing less data than needed by the audio HAL if\nthe condition persisted.\n\nIssue 5553055.\n\nChange-Id: I2b23ee79c032efa945025db228beaecd1e07a2e5\n"
    },
    {
      "commit": "02e1c6fe23c6eb79e0618d218bce647826a1ac0b",
      "tree": "c1010d87c4f7a2940d00a5c9f2a9384580d56b13",
      "parents": [
        "3f511aaf1cb9dfa69e2f4225a5bd41bec0864cc7",
        "25924f8f6c0a4ca4a2eb257b72d9625f69d2525e"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Nov 14 08:41:40 2011 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Mon Nov 14 08:41:40 2011 -0800"
      },
      "message": "am 25924f8f: am 030bb998: Merge \"audioflinger: fix noise when skipping to next song\" into ics-mr1\n\n* commit \u002725924f8f6c0a4ca4a2eb257b72d9625f69d2525e\u0027:\n  audioflinger: fix noise when skipping to next song\n"
    },
    {
      "commit": "f9c361dec4b9380db2b7eeaed68c828e154681ed",
      "tree": "28470dce4b4c925746499203c866112be04ad872",
      "parents": [
        "843e04d977fd348ed474da1d3c6a62e7dc837444"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Nov 11 15:42:52 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Nov 11 16:33:24 2011 -0800"
      },
      "message": "audioflinger: fix noise when skipping to next song\n\nWhen audio effects are enabled, a noise can be heard at the\nbeginning of the new song when skipping to next song in music app.\n\nThis is because some effects (especially virtualizer) have a tail.\nThis tail was not played when previous song was stopped because effects were\nnot processed when no tracks were present on a given session. This is to\nreduce CPU load when effects are enabled but no audio is playing.\nThe tail was then rendered when the new song was started.\n\nAdded a delay before stopping effect process after all tracks have been removed from a session.\n\nIssue 5584880.\n\nChange-Id: I815e0f7441f9302e8dfe413dc269a94e4cc6fd95\n"
    },
    {
      "commit": "b755d530249f442db3c7f0d4d9c8fb9fc4f580ae",
      "tree": "3e90998946930087384a4abcb504b5be83db01b6",
      "parents": [
        "a8a1bf7ab1466fa2ebc5accb8dcf2c5ed2c9b519",
        "db7d79e6f1e1860a9bfe4756a03c753435fd0ddf"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Nov 10 01:11:28 2011 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu Nov 10 01:11:28 2011 +0000"
      },
      "message": "am db7d79e6: am 2b7f91b9: Merge \"Fix regression for SoundPool playback\" into ics-mr1\n\n* commit \u0027db7d79e6f1e1860a9bfe4756a03c753435fd0ddf\u0027:\n  Fix regression for SoundPool playback\n"
    },
    {
      "commit": "8a04fe032b2a9ab0f2905571c59b5ce6bd0e9d71",
      "tree": "38c24b10f3b90f1f66ed320369b38c30ea1dfea0",
      "parents": [
        "650a3e8894c6d26b258d26bdec856fde7aba43d6"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Nov 08 18:10:16 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Nov 08 18:42:37 2011 -0800"
      },
      "message": "Fix regression for SoundPool playback\n\nCommit 19ddf0eb introduced a problem with applications (like SoundPool)\nrelying on an underrun condition to detect end of playback instead of\nstopping the track when all data is written.\nAudioFlinger would keep waiting for new data in case of partial buffer\nfilling and never reach the underrun condition.\n\nAdded a mechanism to wait no more than once if not enough frames are present\nin the track buffer.\n\nIssue 5585490.\n\nChange-Id: I131e605ff6070831a01ddf734e68459e3bf2354b\n"
    },
    {
      "commit": "2cb57608965fd856b4b79b3f950d6c628e66aed5",
      "tree": "9e2a7489dfcb1d44770d123689b3090e34591986",
      "parents": [
        "ba1f05d4a816dd60a6be2a09858d8c9ecf3d552d",
        "f3a892ab9347ce733b81ccb4913a91c586f8f367"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Nov 08 16:37:11 2011 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Nov 08 16:37:11 2011 +0000"
      },
      "message": "am f3a892ab: Merge \"AudioFlinger: mix track only when really ready\" into ics-mr1\n\n* commit \u0027f3a892ab9347ce733b81ccb4913a91c586f8f367\u0027:\n  AudioFlinger: mix track only when really ready\n"
    },
    {
      "commit": "19ddf0ebb013c0ad1d6c04f0c9d6ce177a0fafae",
      "tree": "6f7e20a9393bf28e6c87121695a5193bb4f82f28",
      "parents": [
        "f9d8faf7fe9d23bddf4d8d039805bce806e9b9c6"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Nov 03 12:16:05 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Nov 03 12:16:05 2011 -0700"
      },
      "message": "AudioFlinger: mix track only when really ready\n\nThe addition of low power audio playback mode made that audio buffer consumption\nby audio HAL can now happen in bursts. This makes that requesting audio data\nfrom an AudioTrack for mixing can happen at much shorter intervals than before.\nThis revealed an existing problem where AudioFlinger would consider a track ready\nfor mixing although not enough frames were ready to completely fill one output buffer,\nthus creating short periods of silence.\n\nThe fix consists in waiting for enough frames to be ready in AudioTrack buffer before\ndeclaring a track ready for mixing. This minimum is not applied when the track is stopped\nto allow the buffer to be emptied completely.\n\nChange-Id: I6d04f9b65db5af85b0b53f0a5674be7ec02f9e9f\n"
    },
    {
      "commit": "71f2cf116aab893e224056c38ab146bd1538dd3e",
      "tree": "75a9162a0ea00830184b12a9ca51d3a1a040a5bb",
      "parents": [
        "1da79501066a74b630c8aa138db0f86ab6c690bb"
      ],
      "author": {
        "name": "Steve Block",
        "email": "steveblock@google.com",
        "time": "Thu Oct 20 11:56:00 2011 +0100"
      },
      "committer": {
        "name": "Steve Block",
        "email": "steveblock@google.com",
        "time": "Wed Oct 26 09:57:54 2011 +0100"
      },
      "message": "Rename (IF_)LOGV(_IF) to (IF_)ALOGV(_IF)  DO NOT MERGE\n\nSee https://android-git.corp.google.com/g/#/c/143865\n\nBug: 5449033\nChange-Id: I0122812ed6ff6f5b59fe4a43ab8bff0577adde0a\n"
    },
    {
      "commit": "7fa1cee12c12231b5d72c95dc72512867713ff1b",
      "tree": "747e597778768c37e6c4e82b5820324184a88aca",
      "parents": [
        "70ac412b2fe7be2507189a9fdfb30c43b36d56ac"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Oct 19 11:44:54 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Oct 19 11:44:54 2011 -0700"
      },
      "message": "Fix issue 381905: BassBoostTest CTS tests fail...\n\nWhen AudioEffectTest is executed, an Equalizer is created\nand enabled on a MediaPlayer session. Effects on the output\nmix are therefore suspended.\nThen the MediaPlayer is released with the effect still enabled.\nIn this case, Audioflinger::purgeStaleEffects_l() fails to restore\nthe suspended effects when the effect attached to the released audio session\nis removed.\nWhen subsequent tests are executed on output mix effects, these effects cannot be\nenabled as they are still suspended.\n\nFixed purgeStaleEffects_l() to restore suspended effects if the effect removed is enabled.\n\nAlso fixed EffectHandle::disconnect() to only restore suspended effects if the disconnected\nhandle actually has control over the effect.\n\nChange-Id: I67232e7c34680b0cc01abfd57d5d510a524e5d4f\n"
    },
    {
      "commit": "276fa43b98920f4da60b64fe23da4debb72667c0",
      "tree": "e62373a31e7519bcd4f0d3232685aaac11448de8",
      "parents": [
        "11116b80d88b72e14e4f6b7ad3ab312096f8eea5"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Oct 18 15:42:27 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Oct 18 15:42:27 2011 -0700"
      },
      "message": "Limit AudioFlinger log.\n\nAudioFlinger logs a warning when a write to the audio HAL\ntakes too long to return. The threshold for this warning is\na rule of thumb based on the assumption that the audio HAL will consume\nbuffers at a regular pace.\nThe introduction of low power audio mode with larger buffers and writes\noccuring in bursts makes that this threshold is often exceeded resulting\nin excessive and misleading warnings.\n\nThe threshold is raised to remove unwanted warnings but we should reconsider\nthe usefulness of this warning altogether.\n\nChange-Id: I5ef6898ea28d879cede3e47da542a64092a3cca4\n"
    },
    {
      "commit": "6fccbd04fc7e64dfc05096281cd64d76dfcb299d",
      "tree": "5ae109331b34eda9a381bb55f5e31711cab7ce75",
      "parents": [
        "50dabc5f0efbe2c4a987579cb2ad94132ee587be"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Oct 05 17:42:25 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Oct 05 17:42:25 2011 -0700"
      },
      "message": "Fix issue 5381089: problem with A2DP music volume\n\nThis problem only occurs when audio effects are present and\nthe music volume is applied by one effect engine.\nWhen connecting or disconnecting A2DP, audio effects are moved from\none mixer thread to another. When removed from the source thread,\nthe effect is stopped but it is not restarted when added to the\ndestination thread.\nThis regression was introduced by commit 21b5c47e.\n\nChange-Id: I4cc578d8d760ec65b185032b6fda98c739d331bc\n"
    },
    {
      "commit": "4a64a6e32c40c2708208864961844b242568ea17",
      "tree": "17bfcd23ed7b98897887fb0b7ca84a64068fd806",
      "parents": [
        "71bfec448847d8585c8a789596525dc729350877"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 27 12:07:15 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 27 12:07:15 2011 -0700"
      },
      "message": "Fix issue 5373658: memory leak in AudioFlinger.\n\nUnlink PowerManagerService binder interface death recipient\nin ThreadBase destructor.\n\nChange-Id: Iab06ae9a8a6737bb002b6416a157b0fb50c11ad5\n"
    },
    {
      "commit": "5e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6be",
      "tree": "8cc7a58d39a095530ac0d036d84a5e7b88ab0d12",
      "parents": [
        "d30d2aae108a132ac6ee04cdf29cbec50cc73320"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Sep 23 08:40:41 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Sep 23 10:15:05 2011 -0700"
      },
      "message": "Fix issue 5355047: Automated effect tests fail.\n\nFixed several regressions in automated audio effect tests due\nto changes in effect framework and visualizer FFT output range.\n\n- Do not suspend Volume effect on session 0 when effects are\nenabled on specific sessions.\n- Adapt energy detection thresholds to new visualizer FFT range.\n- Leave more time for BassBoost and Virtualizer effects to ramp up\nbefore measuring the effect.\n- Removed second insert reverb left by mistake on the player session\nin preset reverb test.\n\nChange-Id: I7a1ad1372d783fa7900eb9dd1d3b47f54d8d766f\n"
    },
    {
      "commit": "5f37be324f93b5a4bc0d424845bab59c914cbacf",
      "tree": "0a2ce1853d50dd12869a7b8e8949d86d43a47984",
      "parents": [
        "1cd955b01d8ea72009be56f4c4a93d4d79e902df"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 13 11:40:21 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 13 12:44:22 2011 -0700"
      },
      "message": "Issue 4345021: Audio routed to multiple devices...\n\nThere is a possiblility that the condition on which RecordThread::checkForNewParameters_l()\nwaits after updating the command completion status is never signalled.\nThis happens if the thread executing ThreadBase::setParameters() has timed out waiting\nfor the status (for instance if the audio HAL takes too long to execute the setParameters()\ncommand. Then the RecordThread is stuck forever.\n\nThe fix consists in waiting for the condition with a timeout in RecordThread::checkForNewParameters_l().\n\nChange-Id: I7fc671bc2fc43ba4acb65a2beb33ee05742f091e\n"
    },
    {
      "commit": "0e35c78d25a8df8b3bde566ad6c474f9df242ea4",
      "tree": "257814957ad7bdfc43cb5527c4a22e9e25b88d6f",
      "parents": [
        "d0116b680a2c194eb3b8713a230151bfb32a6aef",
        "05ce0941649c3cdd7f8034496719e607977fc005"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 30 10:51:54 2011 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Aug 30 10:51:54 2011 -0700"
      },
      "message": "Merge \"226483: A2DP connected, but music out to speaker\""
    },
    {
      "commit": "05ce0941649c3cdd7f8034496719e607977fc005",
      "tree": "1e507788895e36bcd18b37cd109ec90e7c46d90c",
      "parents": [
        "2c5423da4e3b23c0381952da2671f05a7501f9af"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 30 10:18:54 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 30 10:19:38 2011 -0700"
      },
      "message": "226483: A2DP connected, but music out to speaker\n\nWhen the A2DP headset is connected, there is a possible\nrace condition when the audio tracks are moved from\nthe mixer thread attached to the speaker output to the thread\nattached to A2DP output.\nAs the request to clear the stream type to output mapping cache in\nthe client process is asynchronous, it is possible that the flag\nindicating to the client audio track to re-create the IAudioTrack\non the new thread is processed before the cache is invalidated.\nIn this case, the track will be attached to the old thread and\nmusic will continue playing over the device speaker instead of being\nredirected to A2DP headset.\n\nChange-Id: Ib2ce1eb5320eaff83287b93779061bf4e7a330df\n"
    },
    {
      "commit": "2d95dfbf4d284780035ac868651402bc39caac32",
      "tree": "9c7a6c9285fed0e26bc85e8a819704950b5e6cdf",
      "parents": [
        "2c5423da4e3b23c0381952da2671f05a7501f9af"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Aug 29 12:42:48 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Aug 29 14:50:38 2011 -0700"
      },
      "message": "Audioflinger: reverse logic of BT NREC indication\n\nThe interpretation of BT NREC by AudioFlinger to enable\nor disable AEC and NS was wrong: NREC to ON (default) means\nthe phone (Audio Gateway) must enable local AEC and NS.\n\nChange-Id: I88a264e7fc9831c43bbace4f6b585baec73f2006\n"
    },
    {
      "commit": "8b4dbf7ff5589a79b56d6fe420527dbc6fd83982",
      "tree": "a5813686b1ed9118429563691a304647ff1a0216",
      "parents": [
        "fb3db1f3a237b08bc125c3cd5ab2c3ff92e76c8d"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 23 08:25:03 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 23 08:25:03 2011 -0700"
      },
      "message": "AudioFlinger: add check for audio HAL init failure\n\nDo not call audio HAL functions on the primary HW interface\nif it could not be initialized properly.\n\nChange-Id: If54059c8fd188d6c1686f9e0439994fe9411478a\n"
    },
    {
      "commit": "2255a1e64f842997273071b359eab6a88a3fe113",
      "tree": "c6a17681b78e1723d619e0f156ccb69f317173be",
      "parents": [
        "88a2053e583180b4b5c37283a727e1795f8da207"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Fri Aug 12 14:14:39 2011 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Fri Aug 12 14:54:56 2011 -0700"
      },
      "message": "Don\u0027t remove effects on session 0\n\nb/5159902\nChange-Id: Id6f29fb1c687069f7480dd81d4745a558f202226\n"
    },
    {
      "commit": "6752ec80b25cb1f39507d18745c7e62323772cda",
      "tree": "a60b43960ba842d1a853337080a568941de42df4",
      "parents": [
        "246ae5011c385d100f73b441ce7e47a6ea7e33ba"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Aug 10 10:37:50 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Aug 11 14:33:45 2011 -0700"
      },
      "message": "Audio effects: track CPU and memory use separately\n\nBefore this change, CPU and memory usage for an audio effect were\nregistered and checked against the limit by audio policy manager\nupon effect instantiation. Even if an effect was not enabled\nit would prevent another effect to be created if the CPU load budget\nwas exceeded, which was too restrictive.\n\nThis change adds a method to register/unregister CPU load only when\nan effect is enabled or disabled.\nIt also adds a mechanism to place all effects on the global output mix\nin suspend state (disabled) when an effect is enabled on a specific session.\nThis will allow applications using session effects to have the priority\nover others using global effects.\n\nAlso fixes some issues with suspend/restore mechanism:\n- avoid taking actions when an effect is disconnected and was not enabled.\n- do not remove a session from the suspended sessions list when corresponding\neffect chain is destroyed.\n\nChange-Id: I5225278aba1ae13d0d0997bfe26a0c9fb46b17d3\n"
    },
    {
      "commit": "c74b93fdf3ddb6fdab7878edab4d304fb14917f9",
      "tree": "96a1db2deffc309c16b63d5e4dc1fda165b6ed8e",
      "parents": [
        "a4418e0fd94f27c0b40abe17d42af0880cb3effb"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Tue Aug 02 13:33:41 2011 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Tue Aug 09 10:21:10 2011 -0700"
      },
      "message": "Keep effects sessions active when the caller dies.\n\nDon\u0027t remove effects until the session they are in goes away or all\nAudioEffects have been explicitly released. This allows the control\npanel process to die without stopping the effects.\n\nChange-Id: I4496e5df080230ca1af149dec95c1309ab8ea888\n"
    },
    {
      "commit": "c993acbce63b60385b01cf1b95a4799ec308339b",
      "tree": "91c5994bc4faa34a22d7cfb495e78de248f2fc63",
      "parents": [
        "6f9ff5368c79f8d8d74ee5fa0cdc5410c57cf671",
        "828b9773cc765f45b4f61af70f2184ca85fa82f9"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Aug 08 09:31:42 2011 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Aug 08 09:31:42 2011 -0700"
      },
      "message": "Merge \"AudioFlinger: protect input/output stream access\""
    },
    {
      "commit": "828b9773cc765f45b4f61af70f2184ca85fa82f9",
      "tree": "3fd6622a05dcd725d6b10bc36f838d2e97518030",
      "parents": [
        "e10bcdb37cad965ea60da3f9d413d7645b3ae75a"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Sun Aug 07 16:32:26 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Aug 08 08:55:29 2011 -0700"
      },
      "message": "AudioFlinger: protect input/output stream access\n\nSome methods would not check that the output orinput stream of a thread\nwas still valid before calling functions on its interface.\nThis could cause a crash if those methods where called while the output or\ninput was being closed by another thread.\n\nMake sure that the output or input stream pointer is cleared before closing the\nstream.\nAlways check that the output or input pointer is not null before calling\nfunctions at the stream interface.\nGeneralize the use of initCheck() method to verify that the output or input\nstream is not null.\n\nChange-Id: I9d9ca6b744d011bcf3a7bbacb4a581ac1477bfa5\n"
    },
    {
      "commit": "6639b559bb0147dd82cda43e794678742f712eb8",
      "tree": "ca64e588af59ee3b44d0b60a883eee64e2acc6e1",
      "parents": [
        "e096f9fa3db1f8d249c9f9688e60fad7f4f93bde"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Aug 01 09:52:20 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Aug 03 11:47:45 2011 -0700"
      },
      "message": "AudioFlinger: disable AEC and NS with BT headsets\n\nDisable AEC and NS when the Bluetooth SCO headset in use indicates it\nimplements those pre processings.\n\nChange-Id: I93f3d10b0a27243d5dbff7182639576fc0c6d862\n"
    },
    {
      "commit": "f82fccd8ae6cd36e5934d6c05eccc8008d9e23ea",
      "tree": "9b5ae75dd461e6189a204033db0c5c256f576078",
      "parents": [
        "e10bcdb37cad965ea60da3f9d413d7645b3ae75a"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Jul 27 19:49:51 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 02 20:03:35 2011 -0700"
      },
      "message": "Audio Effect Framework: add effect suspend/restore\n\nAdd the possibility for the effect framework to suspend\n(temporarily disable process) and restore audio effects.\nThis feature will be usefull to disable pre processing under certain\nconditions and better control coexistence of audio effects\non output mix and specific sources.\n\nChange-Id: I79b195982cc48748d5708308fb1647b9c3c34cc6\n"
    },
    {
      "commit": "d49ead677f734fc551c0677d6d8511a18238feb3",
      "tree": "35a7948e45232fdaf8f6a88ca48bd040dd111772",
      "parents": [
        "a7ffaee29892cc38ae2327017b6670adafef711b"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 28 13:59:02 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 28 13:59:02 2011 -0700"
      },
      "message": "Fix issue 5090721: audio record broken\n\nCommit 6dbdc40 introduced a deadlock when exiting the\nAudioFlinger RecordThread.\n\nChange-Id: I1f63e54c5aeff05da4e4d028b53f734c62c78677\n"
    },
    {
      "commit": "525efbb29d1198d8562a6d070e1cdf88ce721e01",
      "tree": "5139613a970967277c30f5c1036d26b61ddba65b",
      "parents": [
        "693d0427b7f1d778723985bfa3363fe6fdb35ded",
        "21b5c47ed82ab111828db6145af36f220465571c"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Jul 27 09:48:47 2011 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Jul 27 09:48:47 2011 -0700"
      },
      "message": "Merge \"AudioFlinger: fix crash when deleting pre process.\""
    },
    {
      "commit": "21b5c47ed82ab111828db6145af36f220465571c",
      "tree": "1bdd7fabaa397f328e16de94fd657b0753a5f85c",
      "parents": [
        "bce8effe75c5477eb42d4e1c4df609da962285a2"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jul 26 20:54:46 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jul 26 20:54:46 2011 -0700"
      },
      "message": "AudioFlinger: fix crash when deleting pre process.\n\nIf a pre processing effect is detroyed while enabled and capture is active,\nthere was a possibility that the effect engine is released by the framework\nwhile still processed by the audio HAL.\n\nThe fix consists in not releasing the engine in EffectModule::removeHandle()\nbut just flag the effect as being detroyed to avoid further calls to functions\non the engine effect interface.\nThe effect interface is then removed from the audio HAL safely in\nEffectChain::removeEffect_l() while holding the EffectChain mutex.\n\nChange-Id: I71fab30d9145062af8644f545a1f1d4d3e7e7f02\n"
    },
    {
      "commit": "6dbdc40e9a317488fc5f6e14cf9e699bce9a9387",
      "tree": "eed576356d64812249d1b021eff7f88e24bde25a",
      "parents": [
        "6c454c3225fd47422024af915fa28d5210d1e82e"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Jul 22 09:04:31 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Jul 25 18:41:12 2011 -0700"
      },
      "message": "Fix issue 4604090: notification sound interrupted.\n\nThe problem is that the audio HAL fails to acquire the wake lock when playing the notification.\nThis is because of a change that removed the mediaserver process form the system group for honeycomb.\n\nThe fix consists in requesting the wake lock from PowerManagerService when AudioFlinger mixer\nwakes up.\n\nA consequence of this change is that audio HALs or pcm drivers do not have to hold wake locks\nanymore as in the past.\n\nChange-Id: I4fb3cc84816c9c408ab7fec75886baf801e1ecb5\n"
    },
    {
      "commit": "1345d3307692b195be7a5a407e8fc61c4753c1d7",
      "tree": "94249bb179845956243c81e8c547ea762ee3b106",
      "parents": [
        "895de9269fa125bf3903c21faf5e8d2750bfb000"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Sun Jul 24 17:49:51 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Sun Jul 24 17:49:51 2011 -0700"
      },
      "message": "AudioFlinger: add dump of audio pre processing.\n\nDump of media.audio_flinger service was only listing effects on output threads.\nMoved the dump of effect chains from PlaybackThread to ThreadBase class so that\npre processings on RecordThread are also listed.\n\nChange-Id: If8bc74023c12b9c2371f1b300743b156ceca7b87\n"
    },
    {
      "commit": "095086111f70ad538a97c7ef69f633cc74f2dbe6",
      "tree": "78346b22f8902dcffd22f0774f386a736874f005",
      "parents": [
        "ec89a2b6063b3826373f5cbb85f0c620042f12e6"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 21 19:35:01 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 21 21:00:46 2011 -0700"
      },
      "message": "Fix issue 4988574: 8 bit PCM audio playback broken.\n\nFixed regression in audio track control block frame size\ncalculation introduced by commit c310dcb.\n\nChange-Id: Ia731b946ae4e43316b98d80229e3b08a696e47d6\n"
    },
    {
      "commit": "464d5b3da21c84ba13dc69c611d40f6bed49badb",
      "tree": "077449115c49bf62ad94e7328f4ac57729659e41",
      "parents": [
        "919511a6da6a8d49857d7c0c5fa2e9d66d42efc2"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Jun 17 21:29:58 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Jul 18 09:42:57 2011 -0700"
      },
      "message": "Audio framework: support for audio pre processing\n\nAudio effect framework is extended to suport effects on\noutput and input audio path.\n\nAudioFlinger: Support for audio effects and effect chains is\nmoved from PlaybackThread class to ThreadBase class so that\nRecordThread can manage effects.\nEffects of type pre processing are allowed on record thread\nonly. When a pre processing is enabled, the effect interface handle is\npassed down to the input stream so that the audio HAL can call the\nprocess function. The record thread loop calls the effect chain process\nfunction that will only manage the effect state and commands and skip the\nprocess function.\n\nAudioRecord: The audio session is allocated before calling getInput() into\naudio policy serice so that the session is known before the input theead is\ncreated and pre processings can be created on the correct session.\n\nAudioPolicyService: default pre processing for a given input source are\nloaded from audio_effects.conf file.\nWhen an input is created, corresponding effects are created and enabled.\n\nChange-Id: Id17119e0979b4dcf189b5c7957fec30dc3478790\n"
    },
    {
      "commit": "0bd30801c9e0abf6a8a29aab4686de7bce5a5a84",
      "tree": "bc335e3e0228207ff4c854ed51252afdd5ed9ae0",
      "parents": [
        "7e7de71f6eef5652ee1260e40215804a2ce543c3",
        "da494f962592960f2eb5111ad3f7abe1ff8732d5"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jul 15 16:27:13 2011 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jul 15 16:27:13 2011 -0700"
      },
      "message": "Merge \"Log CPU usage\""
    },
    {
      "commit": "da494f962592960f2eb5111ad3f7abe1ff8732d5",
      "tree": "3b8ee538f0947a3fea496f80ed2dc71c985a3e25",
      "parents": [
        "a0c680393f2dd03a937c598b2cb9abf98a58152c"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jul 08 15:26:12 2011 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jul 15 13:28:19 2011 -0700"
      },
      "message": "Log CPU usage\n\nChange-Id: Ie447e59be139153e526b7ad467c46c659d26816f\n"
    },
    {
      "commit": "5cc05263399fea948c3b80f83f07ff7476ef0505",
      "tree": "4e27914026920216147b5f79300f9a61c909cf2e",
      "parents": [
        "1a65b441b127e66c0fae2e04e6f88628a6363209"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Jun 24 07:01:31 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 07 15:25:51 2011 -0700"
      },
      "message": "Moved and renamed effect API header files\n\nMoved specific effect header files to\nsystem/media/audio_effects/include/audio_effects\nand renamed to lower case (effect_xxx.h).\n\nChange-Id: Icfc2264bfd013cab0395d7e310ada636b9fe3621\n"
    },
    {
      "commit": "c310dcbed66026fa548f9ec0821ec15f8c6a080d",
      "tree": "4b1ac3b8ee8fbc3824533bf76f939e9d06ac5554",
      "parents": [
        "b86b030acdaeb1d823ee3c67609516160975824e"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jun 16 21:30:45 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Jun 17 14:19:55 2011 -0700"
      },
      "message": "Added audio_bytes_per_sample() helper function\n\nChange-Id: Ibfcd75c4c241a53d5f052c25ada091904991048a\n"
    },
    {
      "commit": "290029d19a9d314e925b73e19453ab0497602f80",
      "tree": "832511818ed878842cefe5459b12aef6423b4cb1",
      "parents": [
        "10e78c9df09378c7d1ef1be9a8c42659ccce1eb7"
      ],
      "author": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Mon Jun 13 18:16:26 2011 -0700"
      },
      "committer": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Mon Jun 13 18:16:26 2011 -0700"
      },
      "message": "audio: update for audio/audio_policy header names/locations\n\nChange-Id: I36c49352eee57559403cd1597f56a8485a360289\nSigned-off-by: Dima Zavin \u003cdima@android.com\u003e\n"
    },
    {
      "commit": "6af763bec7c3f4d50fee8dd0046409bb8a7fe8f6",
      "tree": "aad20d1f3e7ee495b531dde5ae78626e0911790d",
      "parents": [
        "ed1a9022a19a9003931ce47ff7a0a0b5564255a5"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed May 04 17:58:57 2011 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jun 03 16:12:37 2011 -0700"
      },
      "message": "Remove dead code related to gettid\n\nThe gettid system call is always available now.\n\nChange-Id: Ib78b41781eda182dc8605daf456bbea7ff7c2dc0\n"
    },
    {
      "commit": "5439223b5633679edcc255651e7062046004d75d",
      "tree": "683090bec6f1a9a0fe95609fe5becf54aa3b1f8a",
      "parents": [
        "3a4b8bb6756120cfdef2faa7c1966963ef011faf"
      ],
      "author": {
        "name": "Jean-Michel Trivi",
        "email": "jmtrivi@google.com",
        "time": "Tue May 24 15:53:33 2011 -0700"
      },
      "committer": {
        "name": "Jean-Michel Trivi",
        "email": "jmtrivi@google.com",
        "time": "Wed Jun 01 10:55:29 2011 -0700"
      },
      "message": "Use channel mask instead of channel count for track creation\n\nRecord and playback objects (resp AudioRecord and AudioTrack)\nare created using a channel mask, but this information is lost\nin the mixer because only the channel count is known to\nAudioFlinger. A channel count can always be derived from a\nchannel mask.\n\nThe change consists in:\n- disambiguiting variable names for channel masks and counts\n- passing the mask information from the client to AudioFlinger\n and the mixer.\n- when using the DIRECT ouput, only verifying the format of\n the track is compatible with the output\u0027s for PCM.\n\nChange-Id: I50d87bfb7d7afcabdf5f12d4ab75ef3a54132c0e\n"
    },
    {
      "commit": "8f18cf55747b8ab138661a841cbb1b2bd19f3d97",
      "tree": "42f1d38ba83bec5eb4ddd08823c456b506f242c0",
      "parents": [
        "e8e833fbe8faaa0d49de517040bf01d18c7b9330"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri May 27 17:51:52 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri May 27 17:51:52 2011 -0700"
      },
      "message": "Removed interface to load audio effects libraries\n\nRemoved unused functions allowing dynamic loading of audio effects libraries\nfrom effects factory API.\n\nChange-Id: I06cc5a51dc10aca87c7a8687bbb874babd711eca\n"
    },
    {
      "commit": "0fb66c2b83084a16989afaf949d0101cb6505398",
      "tree": "82955066a3cd98e23ecfb4b33ba0beec715331d2",
      "parents": [
        "03edf6b36469a504bd17a5010c788c8d4e44085c"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue May 17 19:16:02 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri May 27 15:15:00 2011 -0700"
      },
      "message": "New effect library API\n\nMoved and renamed media/EffectApi.h to hardware/audio_effect.h\nModified the effect library API to expose a library info structure\ncontaining an interface functions table.\nAlso removed enums for audio channels, audio format and devices\nfrom effect API and use values from system/audio.h instead.\n\nModified effects factory to support new library interface format and\nload libraries and efffects listed in audio_effects.conf file.\nThe file audio_effects.conf is first loaded from /vendor/etc and\nthen from /system/etc/audio_effects.conf if not found.\n\nModified existing effect libraries to implement the new library interface.\n\nChange-Id: Ie52351e071b6d352fa2fbc06c3846686f8c45df9\n"
    },
    {
      "commit": "bdd8a16282cf85bfdbe4c15adcd5c37db772de11",
      "tree": "4571909fba4d95fab12f9e59d0adb44fcdb4c4c5",
      "parents": [
        "8508485871dd22a998db98ea97403126918c5fa8",
        "f0e95696c03d9b2dca6a301a767071cf599a2845"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon May 23 09:06:03 2011 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon May 23 09:06:03 2011 -0700"
      },
      "message": "Merge \"HAVE_ANDROID_OS AUDIOFLINGER_SECURITY_ENABLED dead\""
    },
    {
      "commit": "6ebbc077404a2ae1c82c746faa7b941901340569",
      "tree": "7fc4fbc2d19327d91409aeefc209c87256a910e5",
      "parents": [
        "d4a010d584e14d6bc3999438dbdb17114c3989f0",
        "90681d6ad203119a2a6a761740dddc6c6662c542"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri May 13 10:24:24 2011 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri May 13 10:24:24 2011 -0700"
      },
      "message": "Merge \"Fix audio effect framework issues\""
    },
    {
      "commit": "90681d6ad203119a2a6a761740dddc6c6662c542",
      "tree": "e29dcfa39980a1d9be5b952f92a0c241cecd8f8a",
      "parents": [
        "ed742306b3d24ba1c2ca3fea0cc2ada8534a18b0"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon May 09 12:09:06 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri May 13 08:34:45 2011 -0700"
      },
      "message": "Fix audio effect framework issues\n\nFix two issues in audio effect framework reported by partners.\n\n1 - Fixed duplicated audio buffer sent to effect process function when\npausing a track.\nModified Effectchain::process_l() function to clear the effect chain\ninput buffer before calling the effect process functions when no track\nis active on the session. Previous code was clearing the buffer after\ncalling the process functions and  when transitioning from active\nto inactive, the last processed buffer was passed again once to effect\nprocess function before being cleared.\n\n2 - Fixed potential mutex cross deadlock when disconnecting an effect\nwhile playback is active. This is because EffectChain::process_l()\nwas calling PlaybackThread::hasAudioSession() thus creating an inversion\nin the mutex lock order (EffectChain mutex locked before ThreadBase mutex).\nThe fix consists in removing the call to hasAudioSession() from process_l()\nand requires each effect chain to keep count of the number of audio tracks\nattached to it (previously only the active tracks were accounted for).\n\nChange-Id: Iee4246694ea8c7a66c012120c629d72dd38f9c35\n"
    },
    {
      "commit": "34bb419e5946ab28112e9e27a4d1b3928d31e0e2",
      "tree": "3186b2ce206a101b19285660af602ec66bdbc831",
      "parents": [
        "b856f43ea7a3a5261a93e432e5ea80005e972530"
      ],
      "author": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Wed May 11 14:15:23 2011 -0700"
      },
      "committer": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Thu May 12 14:09:57 2011 -0700"
      },
      "message": "update for new audio.h header location\n\nChange-Id: Ic4c62c4037800802427eb7d3c7f5eb8b25d18876\nSigned-off-by: Dima Zavin \u003cdima@android.com\u003e\n"
    },
    {
      "commit": "f0e95696c03d9b2dca6a301a767071cf599a2845",
      "tree": "7c03f0b92b39c720b514e0ca4126a0b5250a218f",
      "parents": [
        "f0cae1a3f0243f176fbaa4f708e03141121876d0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu May 05 08:37:41 2011 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu May 05 09:15:56 2011 -0700"
      },
      "message": "HAVE_ANDROID_OS AUDIOFLINGER_SECURITY_ENABLED dead\n\nRemove dead code from the days when Android ran in emulator.\n\nChange-Id: Ibadbbde0538239ad9b2811a3a2e8f8a6d3b6389c\n"
    },
    {
      "commit": "2986f5bed370709c10d24c058591d775e6092d89",
      "tree": "3c2e1233bcf886257c45e538b7c30483d5c0bec4",
      "parents": [
        "31f18889a2c3cd5580db8d2a497a96b7b8a6fd95"
      ],
      "author": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Tue Apr 19 19:04:32 2011 -0700"
      },
      "committer": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Wed Apr 27 16:20:22 2011 -0700"
      },
      "message": "audioflinger: don\u0027t do work in constructor, instead do it in onFirstRef\n\nChange-Id: I22d9e01821816c3beb52b014330386c7fd2f0411\nSigned-off-by: Dima Zavin \u003cdima@android.com\u003e\n"
    },
    {
      "commit": "31f18889a2c3cd5580db8d2a497a96b7b8a6fd95",
      "tree": "066564d02a93ac84aca585d03e77ec7aa2b222ee",
      "parents": [
        "24fc2fb1c541e954b83fd31ea9f786a5e9b45501"
      ],
      "author": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Mon Apr 18 16:57:27 2011 -0700"
      },
      "committer": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Wed Apr 27 16:20:22 2011 -0700"
      },
      "message": "audioflinger: enumerate all the possible audio interfaces\n\nKeep track of the primary interface that handles the master volume,\netc.\n\nChange-Id: Ib0701fccff8d8783a99035a241ab7c8ec75c00ac\nSigned-off-by: Dima Zavin \u003cdima@android.com\u003e\n"
    },
    {
      "commit": "24fc2fb1c541e954b83fd31ea9f786a5e9b45501",
      "tree": "e85b3ff86b73d56e16ab640919d251c046371c65",
      "parents": [
        "4dc22e77cfd2a1c3671e5646ee87c5e4c15596a0"
      ],
      "author": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Tue Apr 19 22:30:36 2011 -0700"
      },
      "committer": {
        "name": "Dima Zavin",
        "email": "dima@android.com",
        "time": "Wed Apr 27 13:10:10 2011 -0700"
      },
      "message": "audio/media: convert to using the audio HAL and new audio defs\n\nChange-Id: Ibc637918637329e4f2b62f4ac7781102fbc269f5\nSigned-off-by: Dima Zavin \u003cdima@android.com\u003e\n"
    },
    {
      "commit": "85b65f2008e7eb8ef492a63cba80555f58915769",
      "tree": "54a9c8a8d30449bc6fbebbac3da25a6518c4873f",
      "parents": [
        "59ad81e19bf8312d4abb5f1b754502a750568be5",
        "ed0079ddddd4070f3369b13b274222da2e69f4b9"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Apr 06 13:03:11 2011 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Apr 06 13:03:11 2011 -0700"
      },
      "message": "Merge \"Miscellaneous code cleanup in audio framework\""
    },
    {
      "commit": "ed0079ddddd4070f3369b13b274222da2e69f4b9",
      "tree": "ead156e5b8cbc905126d3e805d813088cdd3a5ff",
      "parents": [
        "9f4ef02aef8f3cc1969f83f59a9be40f1ff71625"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Apr 04 10:50:50 2011 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Apr 06 10:24:18 2011 -0700"
      },
      "message": "Miscellaneous code cleanup in audio framework\n\nChanges:\n - Move declaration of kClassPathName to top of file so it can be used\n   in more than one place, instead of \"android/media/AudioSystem\".\n - Make private methods static.\n - Add comment to stream_type, audio_mode, force_use types that they must match\n   values in AudioSystem.java.\n - Add comment about unused types mp3_sub_format and vorbis_sub_format.\n - Fix typos.\n - Use @ in javadoc comments.\n - Delete dead APIs setMode, getMode, setRouting, getRouting in AudioSystem.java\n   (they are all hidden, deprecated, and unused by rest of framework)\n - Delete unused private log method.\n - Fix pathname for android_media_AudioSystem.cpp.\n - Improve code formatting for space after \u003d\u003d and !\u003d.\n - Add logging of delta for changing audio policy manager ref count.\n\nChange-Id: I18037c7beb8ab76d1fda08c11e589f6e591d36e1\n"
    },
    {
      "commit": "ae29b7632ecf2068698c0d121cff284dcc82f4ec",
      "tree": "c8193b55997aa1f605a8c80acc76b0b21d101e4e",
      "parents": [
        "42bc0e946f8b986fb3aaada9980b496172e2b511"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Mar 28 18:37:07 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Apr 05 12:05:41 2011 -0700"
      },
      "message": "New fix for issue 4111672: control block flags\n\nThe first fix (commit 913af0b4) is problematic because it makes threads\nin mediaserver process block on the cblk mutex. This is not permitted\nas it can cause audio to skip or worse have a malicious application\nprevent all audio playback by keeping the mutex locked.\n\nThe fix consists in using atomic operations when modifying the control\nblock flags.\n\nAlso fixed audio_track_cblk_t::framesReady() so that it doesn\u0027t block\nwhen called from AudioFlinger (only applies when a loop is active).\n\nChange-Id: Ibf0abb562ced3e9f64118afdd5036854bb959428\n"
    },
    {
      "commit": "913af0b48fbc9a1e4db8411c763b339f2b09c954",
      "tree": "dde52a0e7493b182df9d4e4c84617837e3052288",
      "parents": [
        "a30f43624f76a7d49fcb48944c310cb4dbfc6522"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Mar 17 09:36:51 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Mar 18 08:56:45 2011 -0700"
      },
      "message": "Fix issue 4111672: AudioTrack control block flags\n\nMake sure that all read/modify/write operations on the AudioTrack\nand AudioRecord control block flags field are protected by the\ncontrol block\u0027s mutex.\n\nAlso fix potential infinite loop in AudioTrack::write() if the\nwritten size is not a multiple of frame size.\n\nChange-Id: Ib3d557eb45dcc3abeb32c9aa56058e2873afee27\n"
    },
    {
      "commit": "9b3f1521b521fd7248632fed71a81423e479a523",
      "tree": "0d441152de3df130c3334494289badb20b65d857",
      "parents": [
        "0528bc77948e49bd75cfd4082fb8fef3a7238626"
      ],
      "author": {
        "name": "Gloria Wang",
        "email": "gwang@google.com",
        "time": "Thu Feb 24 14:51:45 2011 -0800"
      },
      "committer": {
        "name": "Gloria Wang",
        "email": "gwang@google.com",
        "time": "Wed Mar 02 16:53:24 2011 -0800"
      },
      "message": "- To track the usage of all audio output devices\n- To track the currently used audio device\n- The devices are separated as speaker and other audio devices\n- Provide the collected data to battery application through pullBatteryData()\n\nChange-Id: I374c755266b5ac6b1c6c630400f4daf901ea8acc\n"
    },
    {
      "commit": "4bb21c496b2c9427c18b8370dd631339e4e11094",
      "tree": "db4452dbae5ed341dc85fcef513b2359c4a363d4",
      "parents": [
        "dd1ddc3b1626f8bc335b6e54a73e8dc18bc71bb5"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Feb 28 16:52:51 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Feb 28 16:52:51 2011 -0800"
      },
      "message": "Fix issue 3479042.\n\nThe problem is that when an AudioRecord using the resampler is restarted,\nthe resampler state is not reset (as there is no reset function in the resampler).\nThe consequence is that the first time the record thread loop runs, it calls the resampler\nwhich consumes the remaining data in the input buffer and when this buffer is released\nthe input index is incremented over the limit.\n\nThe fix consists in implementing a reset function in the resampler.\n\nA similar problem was also present for playback but unoticed because the track buffer is always\ndrained by the mixer when a track stops. The only problem for playback was that the initial\nphase fraction was wrong when restarting a track after stop (it was correct after a pause).\n\nChange-Id: Ifc2585d685f4402d29f4afc63f6efd1d69265de3\n"
    },
    {
      "commit": "8adacd8e22e2a44c941e2b930cc53b7b843f4063",
      "tree": "8335bae5cc2dbfb6227e6905da216d995b3e063b",
      "parents": [
        "c8af866f73ca1b5397a3c7dea4f3948d7e707d35",
        "1570aff60f8de004f0790f93bd0dfb73ee4d0ab2"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 03 18:44:32 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Feb 03 18:44:32 2011 -0800"
      },
      "message": "Merge \"Bug 3366885 Remove LVMX switch\""
    },
    {
      "commit": "1570aff60f8de004f0790f93bd0dfb73ee4d0ab2",
      "tree": "14ac609ed8b26be6d647bcedf1dd3642da848f85",
      "parents": [
        "c33bf55c09b626bd5262e7625f8e4dd62227fa42"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 03 17:18:19 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 03 17:18:19 2011 -0800"
      },
      "message": "Bug 3366885 Remove LVMX switch\n\nChange-Id: I0bf98c6f85f00b3296874571e1c049dcc4e2fcca\n"
    },
    {
      "commit": "25101b0b9a84571ead15b26e9f4cd9c4298d7823",
      "tree": "8f339bdcc562671cd425144be54841f39c56754b",
      "parents": [
        "1cee14f154aadabcd9990bd73a197fbd744660ad"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Feb 02 09:33:30 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Feb 03 09:26:24 2011 -0800"
      },
      "message": "Fix issue 3371080\n\nModified default volume control logic in AudioService:\n1 IN_CALL volume if in video/audio chat\n2 NOTIFICATION if notification is playing or was playing less than 5s ago.\n3 MUSIC\n\nModified silent mode:\n- now also affect MUSIC stream type\n- entering silent mode when VOL- hard key is pressed once while selected\nstream volume is already at 0 (except for VOICE_CALL stream).\n- exiting silent mode when pressing VOL+ hard key while in silent mode\n\nPlay sound FX (audible selections, keyboard clicks) at a fixed volume.\n\nModified audio framework:\n- isStreamActive() method now implemented in AudioPolicyManagerBase (previously AudioFlinger)\n- iStreamActive() now specifies a time window during which the stream is considered\nactive after it actually stopped.\n\nChange-Id: I7e5a0724099450b9fc90825224180ac97322785f\n"
    },
    {
      "commit": "67b5ed31ed1b2ab894a517e0f3d3ee8fbbfdaf16",
      "tree": "0a2e235c9f9b7e0452ff7e2c37a56742ddde2c7c",
      "parents": [
        "54973710d769e4722dc21778f8fcb7b08d2872dd"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Jan 19 18:36:13 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Jan 19 18:36:13 2011 -0800"
      },
      "message": "Fix issue 3371096.\n\nEffectModule::process() was copying effect chain input buffer to\noutput buffer if no effect was active instead of accumulating it.\n\nChange-Id: I2838af2e7b6654d0a76547625929a5453da68d02\n"
    },
    {
      "commit": "01635943012f82ed714f00ee357003519f3de45d",
      "tree": "92ad85f31572a059f2f5a61ae2724cf976b1cd6d",
      "parents": [
        "6cfc7a0acb0d3b202ae1dbee88e7e8bdfaee5590"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jan 18 18:39:02 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Jan 19 09:04:27 2011 -0800"
      },
      "message": "Tentative fix for issue 3362362.\n\nThe problem is likely that one method is called on the AudioPolicyManagerBase\ninstance while it is still being constructed by AudioPolicyService.\n\nTo avoid this, the AudioPolicyService mutex is held by the constructor until the\nplatform specific AudioPolicyManager is constructed and the member\nmpPolicyManager initialized.\n\nAlso added an initCheck() method to AudioPolicyInterface to verify successful\ninitialization of AudioPolicyManager.\n\nA similar change is done in AudioFlinger constructor.\nAlso added some missing protections in AudioFlinger methods where the\nplayback thread list is parsed.\n\nChange-Id: I006b244ec057e1bb0aa5ebe426ef006e3b171056\n"
    },
    {
      "commit": "f3d6dd0782e3135885efdc26cb86cf0bf811749f",
      "tree": "bff3e49ad215f9573b7b89990e974a944d4c4a98",
      "parents": [
        "9c950b41c5531e6735f3d13f5b46ae89d59b3b8c"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Nov 18 08:40:16 2010 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Nov 19 15:49:42 2010 -0800"
      },
      "message": "Fix issue 3157123.\n\nUse a Mutex wherever atomic operations were used in AudioTrack,\nAudioRecord, AudioFlinger and AudioEffect classes.\n\nChange-Id: I6f55b2cabdcd93d64ef19446735b8f33720f8dbc\n"
    },
    {
      "commit": "8f677d66d9c3ba34c97e69b2bb9e161f129af0ee",
      "tree": "c38d12165c0d6eead961d2fc4e8915a0bf936f93",
      "parents": [
        "75663ceec407dbab5740460b6e7ae7ae9403e5a0"
      ],
      "author": {
        "name": "Jean-Michel Trivi",
        "email": "jmtrivi@google.com",
        "time": "Mon Nov 15 12:11:32 2010 -0800"
      },
      "committer": {
        "name": "Jean-Michel Trivi",
        "email": "jmtrivi@google.com",
        "time": "Tue Nov 16 10:23:37 2010 -0800"
      },
      "message": "Add new audio mode for audio communications other than telelphony.\n\nThe audio mode MODE_IN_CALL signals the system the device a phone\n call is currently underway. There was no way for audio video\n chat or VoIP applications to signal a call is underway, but not\n using the telephony resources. This change introduces a new mode\n to address this. Changes in other parts of the system (java\n and native) are required to take this new mode into account.\nThe generic AudioPolicyManager is updated to not use its phone\n state variable directly, but to use two new convenience methods,\n isInCall() and isStateInCall(int) instead.\n\nChange-Id: Id744cd26520ea1d1a4795eabe6a1f0c58789af76\n"
    },
    {
      "commit": "9a30fc13f55ca55bc0409f8a9d2e77d5a803bb7c",
      "tree": "da8a63db182a56c61a463a9967eb98859a2efc41",
      "parents": [
        "b9a40068b590b86904b40bf466571b140d0f94b4"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Oct 05 14:41:42 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Oct 05 14:41:42 2010 -0700"
      },
      "message": "Fixed AudioFlinger not always pausing tracks\n\nIf the pause request is received before the AudioTrack buffer was\ncompletelly filled and the track ready for mixing, the pause is\nnot executed: the track just underruns and stays in pausing state.\n\nThe fix consists in considering the track ready for mixing immediately\nif pausing.\n\nChange-Id: Ia6cb4703fee2126e41011a6400ea8eeb3a3e5456\n"
    },
    {
      "commit": "4712baab81d0b683bc22668d2278c9daff92797e",
      "tree": "e2af5c484425ede13606e62569ad615b184d2d8f",
      "parents": [
        "0a972acf85ce0cf7bba5a77628e9cf59a0946bd0"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Sep 30 16:12:31 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Sep 30 17:21:23 2010 -0700"
      },
      "message": "Issue 3032913: improve AudioTrack recovery time\n\nThis issue showed that when an AudioTrack underruns during a too long period\nof time and is therefore disabled by audioflinger mixer, it takes an additional\ndelay of up to 3 seconds to recover.\nThis fix adds a simple mechanism to recover immediately when the client application\nis ready to write data again in the AudioTrack buffer\n\nAlso throttle warnings on record overflows\n\nChange-Id: I8b2c71578dd134b9e60a15ee4d91b70f3799cb3d\n"
    },
    {
      "commit": "4fd3ecc1f0b8d95f52b516cd81fe4f06607d5cb0",
      "tree": "f01db4d9eb88b7ecf512f39d05a65fc0eb4275fc",
      "parents": [
        "65a5ba45559e88a50c258d794a1728498c248376"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 28 14:09:57 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Sep 28 14:23:39 2010 -0700"
      },
      "message": "Fix several audio effects problems.\n\nFixed the following issues in LVM effect bundle wrapper:\n- memory leaks in EffectCreate() in case effect creation fails at various stages\n- Added saturation when accumulating to output buffer\n- Fixed problems with enabled effects count when an effect is released while enabled\n- Do not allocate temporary buffer for accumulation each time process() is called\n\nFixed the following issues in effects framework (AudioFlinger)\n- Release effect synchronously in the library when deleted from effect chain\n- Do not call the effect process function if no tracks are present in the same\naudio session\n\nChange-Id: Ifbd80a163415cfb3c0a337c12082853ea45d9c91\n"
    },
    {
      "commit": "98c92599acebb8ca893d54d3dc4c96a0c037f0a8",
      "tree": "67fa604082bb5f070a15e92b5d0318d1d43020de",
      "parents": [
        "287952c35e148811c106bc0f5036eabf20f71562"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Sep 23 16:10:16 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Sep 24 09:32:40 2010 -0700"
      },
      "message": "Fix issue 3007862\n\nRemoved a cross deadlock condition between audioflinger and audio policy\nservice mutexes.\nAudioflinger::createEffect() locks audioflinger mutex and then calls\nAudioSystem::getOutputForEffect() which ends up in\nAudioPolicyService::getOutputForEffect() which locks audio policy service\nmutex. If at the same time, the command thread in audio policy service is\nprocessing a command(set volume, set route...), the mutex is locked and the\ncommand will call one audioflinger method which in turn will attempt to\nlock audioflinger mutex.\nThe fix consists in releasing audioflinger mutex before calling\ngetOutputForEffect().\n\nChange-Id: Id44e7feb36e0a295731f6aa97cf32d022edd34d0\n"
    },
    {
      "commit": "14beea487c065ca902bfd7089399eb71a805e302",
      "tree": "8155c1f34b7c4185f8bd06f4f294b18f4bf1db50",
      "parents": [
        "3efbc55545673f3988cb1b2934b903d78f8873cd"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Sep 22 14:17:38 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Sep 22 15:58:38 2010 -0700"
      },
      "message": "Request permission for global audio effects.\n\nApplications creating an audio effect on the output mix must\nhave the MODIFY_AUDIO_SETTINGS permission.\n\nChange-Id: I57d88533f91ad0d33680107d79abcec28f7263b5\n"
    },
    {
      "commit": "27a2fdfb8ad1606bdb686c35e30ae894dd037588",
      "tree": "c9f89831cf031eb9d3982f021d21e187cffcef56",
      "parents": [
        "e442fb6c9215fc6329522915805a9582ec2c3323"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Sep 10 17:44:44 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Sep 13 09:08:28 2010 -0700"
      },
      "message": "Fix volume problems with insert revert\n\n- Use a constant input level to the reverb engine and implement volume control in the\ninsert reverb. This avoids the volume spikes when an effect that was inserted after\nthe reverb is disabled or removed.\n- Fix clicks (one silent buffer) at the end of the reverb disable period.\n- Modified volume management in audioflinger so that the volume ramp is also done by\nthe insert effect if present when the track is paused (avoids clicks).\n- Increased room level for all presets.\n\nAlso fixed problems with output stage session (-1):\n- effect bundle wrapper was not designed to support session -1\n- the permission check in audioflinger for using session -1 failed due to a wrong usage of\ngetCallingPid()\n\nChange-Id: Id1ff51327263364bf71d3f2668fa5cde4311d84f\n"
    },
    {
      "commit": "e65280c5528d38a88fee6366328cf57dbe5a047f",
      "tree": "c4c97e12aa3de27e79c846fda1c5041331cd1a8d",
      "parents": [
        "73ef5d4e2bcbf28ccb84580439f2f79d5cea1ec7"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Sep 02 11:56:55 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Sep 02 11:56:55 2010 -0700"
      },
      "message": "Fix problem in AudioEffect::command() status.\n\nThe *pReplyData argument of the command() function was left unitialized by EffectHandle::command()\nwhen command was EFFECT_CMD_ENABLE, EFFECT_CMD_DISABLE and EFFECT_CMD_SET_PARAM_COMMIT.\n\nChange-Id: I91a19817ead2a8cfbdd8e2d77ca270c7ce9d5bd4\n"
    },
    {
      "commit": "a92ebfa1cd96dc91174f68baab820dbed8239e4b",
      "tree": "0279d11049f5bd1ff971b41c528dd05de9395839",
      "parents": [
        "63070856d034a2819a26560bc7f2881e501c78b7"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 31 13:50:07 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Aug 31 15:26:23 2010 -0700"
      },
      "message": "Audio Effects: fix problems in volume control.\n\n- Fixed click when re-enabling effect during the turn off phase:\nmake sure the effect states where effect is processed are the same\nwhere volume control is delegated to effect.\n- Fixed click when effect is deleted while still active: do not apply\nvolume ramp if an effect having volume control was just removed from the\neffect chain.\n\nAlso fixed a crash when PCM dump is enabled in effect bundle wrapper.\n\nChange-Id: Ib562f5cf75c69af75df0e862536262e2514493e4\n"
    }
  ],
  "next": "8448a79767b7dfc53a12502661cba89774733c10"
}
