)]}'
{
  "log": [
    {
      "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": "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": "5f29ca38b71506ad7c7cb9925efbddf588e9655b",
      "tree": "e67bef8a10e8705ebe0f43fbf49d27764a362040",
      "parents": [
        "25b248eb52a0a16adaef6b79c9d92cb88b9a2bc2",
        "54c3b66444ebfb9f2265ee70ac3b76ccefa0506a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 09 11:59:17 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Jan 09 11:59:17 2012 -0800"
      },
      "message": "Merge \"By convention const goes before the type specifier\""
    },
    {
      "commit": "54c3b66444ebfb9f2265ee70ac3b76ccefa0506a",
      "tree": "2ae6ae86501101399d639f2a1227742c120e7ac8",
      "parents": [
        "a2a0a5d7d56baa831870f4bf2a0d942a477d92ef"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 06 07:46:30 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 06 08:00:59 2012 -0800"
      },
      "message": "By convention const goes before the type specifier\n\nChange-Id: I70203abd6a6f54e5bd9f1412800cc01212157e58\n"
    },
    {
      "commit": "88592eccaf6afcddd5f985955be92fe25205c680",
      "tree": "5a1795bd7aefe20d332f7388d8cddcadc3df841a",
      "parents": [
        "a2a0a5d7d56baa831870f4bf2a0d942a477d92ef",
        "9c56d4ae6212c21ce5fd71ed534eb195983a07c1"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 05 08:20:10 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Jan 05 08:20:10 2012 -0800"
      },
      "message": "Merge \"Remove the notion of \"active track\" from mixer\""
    },
    {
      "commit": "a2a0a5d7d56baa831870f4bf2a0d942a477d92ef",
      "tree": "1979692770dd902d0aa7e8c0760e496e13539e5c",
      "parents": [
        "7ab41c9f773ba599646f1b0d00955c1be80f92fd",
        "f6b1678f8f508b447155a81b44e214475ab634a8"
      ],
      "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": "f6b1678f8f508b447155a81b44e214475ab634a8",
      "tree": "dabe2858dfed9133c6a270cd6b86877a9d3588b1",
      "parents": [
        "94023fa6744e24f26f0aba1699ec278649bd66df"
      ],
      "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": "7ab41c9f773ba599646f1b0d00955c1be80f92fd",
      "tree": "02a8e0276a550d6748b64e6b4e165dd562712859",
      "parents": [
        "b8a805261bf0282e992d3608035e47d05a898710",
        "fe0698f9d44ca923ff1ba528f2c42019937ea5e2"
      ],
      "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": "071ccd5a9702500f3f7d62ef881300914926184d",
      "tree": "2ffdfd9dbc064aa3d2a9b229f87b679220ef4f79",
      "parents": [
        "69aac3e6cd68e8c305a41b2677123db7662efd4b"
      ],
      "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": "9c56d4ae6212c21ce5fd71ed534eb195983a07c1",
      "tree": "417c958c4fd243f4edb7bc765f4dc1e709456ddc",
      "parents": [
        "bbaf8673f1d1dd79d1b7f474ca7111da58e84aff"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Dec 19 15:06:39 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Dec 20 16:29:21 2011 -0800"
      },
      "message": "Remove the notion of \"active track\" from mixer\n\nThis is a first step towards making the mixer more object-oriented.\n\nChange-Id: Ifd445d0e471023a7f5c82e934736ffc95ba1b05b\n"
    },
    {
      "commit": "12d9702773c8a3242a44dd6528126c9ff0dade43",
      "tree": "a0184b1a6a55a924143411129a4cd13d9dbcaa08",
      "parents": [
        "bbaf8673f1d1dd79d1b7f474ca7111da58e84aff",
        "81a028fef62bcadf13fc8550067a3d29c918b3ca"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Dec 20 10:29:49 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Dec 20 10:29:49 2011 -0800"
      },
      "message": "Merge \"Remove dead code\""
    },
    {
      "commit": "81a028fef62bcadf13fc8550067a3d29c918b3ca",
      "tree": "9d2c12b20abcf5e1aad3522678e685b173db776b",
      "parents": [
        "eebeceec684a36222b4559e3157b0db04c0a67ed"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 15 09:53:12 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Dec 19 15:55:47 2011 -0800"
      },
      "message": "Remove dead code\n\nChange-Id: Icf23f7f90fdeb660f4015f22cf239e6d05f5d03c\n"
    },
    {
      "commit": "f602a5f7f29e694a7da4c143737b74501c00477d",
      "tree": "c7edef89cc88918b8cb04168253664470de77036",
      "parents": [
        "d1e672acd8fa1af899f85ee2321327237028adf8",
        "bf71f1e7948406492376c6cbd5e6a30c8cb670e4"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Dec 16 15:10:36 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Dec 16 15:10:36 2011 -0800"
      },
      "message": "Merge \"Use constants for 2 and 32\""
    },
    {
      "commit": "d1e672acd8fa1af899f85ee2321327237028adf8",
      "tree": "bdcc71f510c339222d386c07a0e40121f1ab15b9",
      "parents": [
        "b92bc47a05925c29efef0d66711b6d3f17f406e7",
        "3b21c50ef95fe4e7ac3426ca14b365749e66ff08"
      ],
      "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": "bf71f1e7948406492376c6cbd5e6a30c8cb670e4",
      "tree": "077a8a894c95655353bd5ffec7c4c93f1d36b9be",
      "parents": [
        "b92bc47a05925c29efef0d66711b6d3f17f406e7"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Dec 13 11:52:35 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Dec 16 14:55:05 2011 -0800"
      },
      "message": "Use constants for 2 and 32\n\nChange-Id: If820dfd58b6df258570750610a07af99598d9e53\n"
    },
    {
      "commit": "788040c5189bbdaf567ce4b29ffd1db08ea1020c",
      "tree": "75cf254063bf823fd2e5ff6c3504ecc2c37bb488",
      "parents": [
        "154a7fbda9b704bc1d23b6f17573016ebb5989be"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu May 05 08:19:00 2011 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Dec 16 13:28:33 2011 -0800"
      },
      "message": "Use switch in AudioMixer::setParameter\n\nReplace series of if/then/elses by easier-to-read switch.  Also return\nvoid instead of status_t, since callers weren\u0027t checking it. Assert on\nbad input parameters.\n\nChange-Id: Ie1f0a297977b28501d20e1af819afed9b4750616\n"
    },
    {
      "commit": "3b21c50ef95fe4e7ac3426ca14b365749e66ff08",
      "tree": "e3f9a8d6ab695bd1d4d494fbf1b9d80bcc25585c",
      "parents": [
        "eebeceec684a36222b4559e3157b0db04c0a67ed"
      ],
      "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": "6d4bf6eda04888144ec59cba4816a2cbb79b9e5c",
      "tree": "213424db0d71f1de94ea2789d272595287664bf6",
      "parents": [
        "b87c068727a15a3d3f0bfdcb758c76a097f5e869",
        "fba380a0b2c62684ce4272a05165965bae29d6a1"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Dec 16 07:30:14 2011 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Dec 16 07:30:14 2011 -0800"
      },
      "message": "Merge \"setActiveTrack and setBufferProvider can\u0027t fail\""
    },
    {
      "commit": "b87c068727a15a3d3f0bfdcb758c76a097f5e869",
      "tree": "49768247c538c838564c4546bc55cb3df572b56f",
      "parents": [
        "255adceb85bc23de61fb138ddb474852514b3b33",
        "1c48c3c61970527b97892ab6a2daae8eaac26964"
      ],
      "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": "fba380a0b2c62684ce4272a05165965bae29d6a1",
      "tree": "d0a89a2c45aa09a838c5f93108a3be8f5a80d4e5",
      "parents": [
        "eebeceec684a36222b4559e3157b0db04c0a67ed"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 15 15:46:46 2011 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 15 15:55:51 2011 -0800"
      },
      "message": "setActiveTrack and setBufferProvider can\u0027t fail\n\nReturn void, not status_t, from setActiveTrack and setBufferProvider.\n\nThese methods returned status_t, but the callers never checked the\nreturn value.  Since these aren\u0027t externally visible APIs, they now\nreturn void, and assert on bad input parameters.\n\nChange-Id: I530ed29484596ae41e8659826ca425149c51c2a1\n"
    },
    {
      "commit": "1c48c3c61970527b97892ab6a2daae8eaac26964",
      "tree": "24fed87db69fcce3fb6f3b01bb72501445102c04",
      "parents": [
        "eebeceec684a36222b4559e3157b0db04c0a67ed"
      ],
      "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": "362c4e697d8e9c034e964ac7b40227e054491547",
      "tree": "dde3ca3f11e00cc82f1b6a6bd7ebe7b1c24421c5",
      "parents": [
        "eebeceec684a36222b4559e3157b0db04c0a67ed"
      ],
      "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": "0d255b2d9061ba31f13ada3fc0f7e51916407176",
      "tree": "4df26e48710542386bddab7a0d1cbfa5d6835ac0",
      "parents": [
        "65580f9adf6c4d98449ad0716488f9fe3869aa5a"
      ],
      "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": "243f5f91755c01614a8cafe90b0806396e22d553",
      "tree": "d6f4e9f1593f468967f75a82f21d8058a93c5ed1",
      "parents": [
        "8ddeebb93cb41e7a8e9fe763afb6c6016b21fa61"
      ],
      "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": "65ab47156e1c7dfcd8cc4266253a5ff30219e7f0",
      "tree": "da088916c7cadadcddf47467f20cc8b0b6ff7f41",
      "parents": [
        "98fe12aba55e8b8bb14b23c4c3cdba9a99a9753c"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Wed Jul 14 17:59:35 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Wed Jul 14 17:59:35 2010 -0700"
      },
      "message": "move native services under services/\n\nmoved surfaceflinger, audioflinger, cameraservice\n\nall native services should now reside in this location.\n\nChange-Id: Iee42b83dd2a94c3bf5107ab0895fe2dfcd5337a8\n"
    }
  ]
}
