)]}'
{
  "log": [
    {
      "commit": "810280460da5000785662f6c5b0c7ff3ee0a4cb3",
      "tree": "e098121453bef74dc47c00bb294db78daeebce19",
      "parents": [
        "6e66e4a9ffcb202beb2bcedb85c7d6f9ff391b4c"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Apr 30 18:15:12 2012 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Apr 30 18:15:12 2012 -0700"
      },
      "message": "Temporary fix for both normal tracks \u0026 fast tracks\n\nIf there is at least one active fast track, it forces a mixer\nstatus of ready, which messes up the logic for normal track underruns.\n\nChange-Id: I9de2fcaef090e2c2f99682333af3d3dd618b0d6b\n"
    },
    {
      "commit": "288ed2103d96f3aabd7e6bea3c080ab6db164049",
      "tree": "dec8e7b3a993e86baa8916ba70dcd6b3c053d062",
      "parents": [
        "0c0abd4ad26971b5fba94734137fe0bb1a590ab6"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Apr 25 17:52:27 2012 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Apr 30 13:00:31 2012 -0700"
      },
      "message": "Fix race condition for non-started fast tracks\n\nThis required re-implementing how fast tracks are considered active.\nNow, they use the same logic as normal tracks, except underrun is ignored.\n\nOther changes:\n - add framesReady() to AudioBufferProvider interface\n - rebased\n - add track underrun counter state to fast mixer dump state\n - move dumpsys header to Track::appendDumpHeader()\n   so it closer to where tracks are dumped\n - display track state in dumpsys as a character code\n - measure and display warmup time and cycles in dumpsys\n - copy in the presentation complete code\n - add ExtendedAudioBufferProvider for framesReady() which returns size_t\n - simplify underrun tracking\n - deferred reset track after stop()\n - add comments\n\nChange-Id: I7db8821bc565230ec76da1f9380fe3fb09735e5b\n"
    },
    {
      "commit": "83faee053cfd4251dbb591b62039f563ffdac399",
      "tree": "ca170f9a6c1a715ecc00ef49fc600aad92a23e11",
      "parents": [
        "209ec37b27a4fb6c92005c91ecf993ec19a3d430"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Apr 27 18:24:29 2012 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Apr 27 19:00:37 2012 -0700"
      },
      "message": "AudioFlinger: fix stop detection for static tracks\n\nThe end of playback and end of presentation detection was broken for\nstatic AudioTracks (tracks using shared memory buffers passed by client).\n\nThe mixer should not wait for a minimal amount of frames to be available to mix\na static track otherwise the last frames might never be consumed.\n\nA static track should be removed from active list in case of underrun even if not\nstopped().\n\nIssue 6411521.\n\nChange-Id: I66a2c1a77e98149e5049a223a6f04c3b8c5ad11a\n"
    },
    {
      "commit": "da747447c1d4b5205469b4e94485b8769df57a97",
      "tree": "7171032a464dba232449b98c16709e672ae97b82",
      "parents": [
        "940335776b6d4eb91b13c4e56bc20bed3ac0011b"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Apr 25 18:53:13 2012 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Apr 26 10:36:28 2012 -0700"
      },
      "message": "AudioFlinger: fix tracks ready for mixing logic.\n\nCommit fec279f5 broke the logic allowing to wait for an application\nto provide frames for mixing in the case of several active tracks.\n\nThis was causing audio gaps when playing music and superposing a\nsound Fx (keyboard clicks...).\n\nIssue 6185007.\n\nChange-Id: Id0fad150d0b615646d6b1387c0de8ca944d228f6\n"
    },
    {
      "commit": "58912562617941964939a4182cda71eaeb153d4b",
      "tree": "f0d9551f41e729540b5c0bc23bd5f0b4682d346e",
      "parents": [
        "a08f041125c7688aa33aef1b229278641ae1c375"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Apr 03 10:45:00 2012 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Apr 23 09:24:28 2012 -0700"
      },
      "message": "AudioFlinger normal mixer uses FastMixer\n\nChange-Id: I3131bb22d2d057e9197a2ebfa6aa1cfaab9e5321\n"
    },
    {
      "commit": "3acbd053c842e76e1a40fc8a0bf62de87eebf00f",
      "tree": "1d6dcc01039a1af770131c6b427efa27a2e5755f",
      "parents": [
        "f853499c6a088ef8506cacbb3ccdffa87e0cec3e"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 10:39:56 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Sun Apr 22 14:50:01 2012 -0700"
      },
      "message": "Configure policy of mediaserver threads\n\nChange-Id: Ifd825590ba36996064a458f64453a94b84722cb0\n"
    },
    {
      "commit": "0ca3cf94c0dfc173ad7886ae162c4b67067539f6",
      "tree": "bc156e7822e663626b78ec2ad09ef3970fbb48c5",
      "parents": [
        "ee685f6d19a6cc3b0bf02e69eb5dea11a2aeb601"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Apr 18 09:24:29 2012 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Apr 18 15:04:46 2012 -0700"
      },
      "message": "rename audio policy output flags\n\nChange-Id: I27c46bd1d1b2b5f96b87af7d05b951fef18a1312\n"
    },
    {
      "commit": "1c345196edc61694f29307a1826a64a0d26028dc",
      "tree": "425a9fb3abcd532f061d45d74ddf0a04b88bac3a",
      "parents": [
        "9fbdee13d09447550dd22ae72c2dbabdce7f0a80"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Tue Mar 27 14:00:17 2012 -0700"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Thu Apr 12 10:14:32 2012 -0700"
      },
      "message": "TimedAudio: Track of the number of pending frames.\n\nThis is a manual merge from ics-aah\n\n\u003e TimedAudio: Track of the number of pending frames.\n\u003e\n\u003e Keep track of the number of frames pending in the timed audio queue so\n\u003e we can implement framesReady in O(1) time instead of O(N).  This\n\u003e change partially addresses bug 6020970; the bug will be completely\n\u003e addressed once this change has been up-integrated into master.\n\u003e\n\u003e Change-Id: I599eb15ea1f6d715b97b30e65214fb6fadd169df\n\u003e Signed-off-by: John Grossman \u003cjohngro@google.com\u003e\n\nChange-Id: I6cbbbc3afc8efd066fe94865326ede0c6b3db2bd\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\n"
    },
    {
      "commit": "9fbdee13d09447550dd22ae72c2dbabdce7f0a80",
      "tree": "9568a7d3610f1596b8da38cc921c3782691391cd",
      "parents": [
        "b34364269683363ca54aeed4952937cf37da7e06"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Mon Mar 26 17:51:46 2012 -0700"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Thu Apr 12 10:14:32 2012 -0700"
      },
      "message": "TimedAudio: Fix a cause of audio popping.\n\nThis is a manual merge from ics-aah\n\n\u003e TimedAudio: Fix a cause of audio popping.\n\u003e\n\u003e Fix an issue with buffer lifecycle management which could cause audio\n\u003e pops on timed outputs.  There were two issues at work here.\n\u003e\n\u003e 1) During trim operations for the queued timed audio data, buffers\n\u003e    were being trimmed based on their starting PTS instead of when the\n\u003e    chunk of audio data actually ended.  This means that if you have a\n\u003e    very large chunk of audio data (larger than the mixer lead time),\n\u003e    then a buffer at the head of the queue could be eligible to be\n\u003e    trimmed before its data had been completely mixed into the output\n\u003e    stream, even though the output stream was fully buffered and in no\n\u003e    danger of underflow.\n\u003e 2) The implementation of getNextBuffer and releaseBuffer for timed\n\u003e    audio tracks was not keeping anything like a reference to the data\n\u003e    that it handed out to the mixer.  The original architecture here\n\u003e    seemed to be expecting a ring buffer design, but timed audio tracks\n\u003e    use a packet based design.  Pieces of packets are handed out to the\n\u003e    mixer which then frequently will hold onto that chunk of data\n\u003e    across two mix operations, using the first part of the chunk to\n\u003e    finish a mix buffer and then using the end of the chunk for the\n\u003e    start of the next mix buffer.  If the buffer that the mixer is\n\u003e    holding a piece of got trimmed before the start of the next mix\n\u003e    operation, it would return to its heap and could be filled with who\n\u003e    knows what by the time it actually got mixed.  On debug builds,\n\u003e    they seem to get zero\u0027ed out as they go back to the heap causing\n\u003e    obvious pops in presentation.\n\u003e\n\u003e This change addresses both issues.  Trim operations are now based on\n\u003e ending presentation time for a chunk of audio, not the start.  Also,\n\u003e when the head of the queue is in flight to the mixer, it can no longer\n\u003e be trimmed immediately, merely flagged for trim by the mixer when the\n\u003e mixer finally does call releaseBuffer.\n\u003e\n\u003e Signed-off-by: John Grossman \u003cjohngro@google.com\u003e\n\u003e Change-Id: Ia1ba08cb9dea35a698723ab2d9bcbf804f1682fe\n\nChange-Id: I2c5e2f0375c410f0de075886aac56ff6317b144c\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\n"
    },
    {
      "commit": "7d5b26230a179cd7bcc01f6578cd80d8c15a92a5",
      "tree": "563086c1185e0e54770d8c60c8eec1aefdddb89f",
      "parents": [
        "4b75a9c8b93a90749bc5d22912ad0d96c12f4ecf"
      ],
      "author": {
        "name": "Jean-Michel Trivi",
        "email": "jmtrivi@google.com",
        "time": "Wed Apr 04 18:54:36 2012 -0700"
      },
      "committer": {
        "name": "Jean-Michel Trivi",
        "email": "jmtrivi@google.com",
        "time": "Mon Apr 09 11:27:14 2012 -0700"
      },
      "message": "AudioMixer uses downmix effect for multichannel content\n\nIn the AudioMixer structure associated with each track, add an object\n  that acts as the buffer provider when the track has more than two\n  channels of input in the mixer. This object, DownmixerBufferProvider,\n  gets audio from the actual buffer provider of the track, and applies\n  a downmix effect on it.\nThe downmix effect is created and configured when the track gets\n  created in AudioFlinger, which causes AudioMixer::getTrackName()\n  to be called with the new track\u0027s channel mask. It is released\n  when the track is disabled in the mixer.\n\nChange-Id: I05281ed5f61bef663a8af7ca7d5ceac3517c82db\n"
    },
    {
      "commit": "a4c5a550e2a3bc237179b8684e51718e05894492",
      "tree": "be7b6d154763ed772738a0126d10e6317920767d",
      "parents": [
        "1a9ed11a472493cac7f6dfcbfac2064526a493ed"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Mar 29 10:12:40 2012 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Apr 04 08:44:57 2012 -0700"
      },
      "message": "audio policy: load audio hw modules.\n\nAudio HW modules are now loaded upon request from audio policy manager\naccording to the configuration in audio_policy.conf.\nRemoved hard coded HW module loading by AudioFlinger at init time.\nAdded methods to IAudioFlinger and AudioPolicyInterface\nto control the loading of audio HW modules.\nAdded methods to open an output or input stream on a specific hw module.\n\nChange-Id: I361b294ece1a9b56b2fb39cc64259dbb73b804f4\n"
    },
    {
      "commit": "1a9ed11a472493cac7f6dfcbfac2064526a493ed",
      "tree": "5f4a3c6856f294b3c0371afd87df96277215107b",
      "parents": [
        "290ca3a767a974ce9d041e5bcb0c69153f7851d5"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Mar 20 18:36:01 2012 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Apr 03 16:53:25 2012 -0700"
      },
      "message": "audio policy: add configuration file\n\nremoved outputs to stream mapping cache in audio system: the output for a\ngiven stream type must always be queried from audio policy manager as the cache\nis not always updated fast enough by audioflinger callback.\n\nremoved AudioFlinger::PlaybackThread::setStreamValid() not used anymore if\nstream to output mapping is not cached.\n\nChange-Id: Ieca720c0b292181f81247259c8a44359bc74c66b\n"
    },
    {
      "commit": "73d227557ba5192735356bacab9f77b44980793b",
      "tree": "7c7f0e72f5ffa5ff5920c35c3ad03b6b821e831f",
      "parents": [
        "2d6486f9112a6f0d23f17eaaad94bac62e16caab"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 19 13:38:30 2012 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Apr 02 11:26:18 2012 -0700"
      },
      "message": "AudioFlinger track flags and server\u0027s fast policy\n\nChange-Id: I72358c8e6829d173b3e60ced8a8babc089869fac\n"
    },
    {
      "commit": "0bf65bdde04b8e66c998ff37e2b2afafddddfa33",
      "tree": "3d80772f82336a6272ce05b019b09012c0b0b8df",
      "parents": [
        "deeb1282621f3177ad667360b40eef8e4fedb298"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 18:32:53 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Apr 02 11:09:14 2012 -0700"
      },
      "message": "const methods and comments\n\nChange-Id: Ifd16750174fdb15b72507787502b587562ffc99e\n"
    },
    {
      "commit": "a011e35b22f95f558d81dc9c94b68b1465c4661d",
      "tree": "3f8c46c8c7e30f36c3b629174a26bc4ca2a860b2",
      "parents": [
        "b4c0c4b800332fe55c60aa328ece8d849cee3a4d"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Mar 29 15:51:43 2012 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Mar 29 19:50:49 2012 -0700"
      },
      "message": "implemented synchronous audio capture\n\nAdded the infrastructure to support the synchronization of playback and\ncapture actions on specific events.\nThe first requirement for this feature is to synchronize the audio capture\nstart with the full rendering of a given audio content.\nThe applications can further be extended to other use cases\n(synchronized playback start...) by adding new synchronization events and\nnew synchronous control methods on player or recorders.\n\nAlso added a method to query the audio session from a ToneGenerator.\n\nChange-Id: I51f1167290d9cafdf2fbcdf9e4785156973af44c\n"
    },
    {
      "commit": "b83d38feeeb88a8a2a6219e1fca2480b5a14fb0d",
      "tree": "7e1392f0427d0300d8140ef0a6c18dc32f393831",
      "parents": [
        "8f7f7ad54c698cb57a2a369cf1ae5b917853917b",
        "a075db4ff9b086ac2885df77bb6da0869293df92"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 26 07:16:37 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 26 07:16:37 2012 -0700"
      },
      "message": "Merge \"IAudioFlinger::createTrack and openRecord flags\""
    },
    {
      "commit": "c5c49398584f2399af905a931e556ed6e0a29cd4",
      "tree": "0da87ace16edf4a3b992ca9a9934d34b73450ebd",
      "parents": [
        "ccf89b54f973f11082150d02ed957f7e967fbc8b",
        "f99590187e2e3f1cf6f093063170edec269cac5d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 21 08:29:18 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Mar 21 08:29:18 2012 -0700"
      },
      "message": "Merge \"Clean up Track constructor\""
    },
    {
      "commit": "f99590187e2e3f1cf6f093063170edec269cac5d",
      "tree": "6eebb059b54519d1208ca349e63fc4cf452bc4d5",
      "parents": [
        "6da08fc33642b832d1cde2e46815a5fd67dd0016"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 19 11:14:37 2012 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 20 17:15:12 2012 -0700"
      },
      "message": "Clean up Track constructor\n\nThe \u0027thread\u0027 parameter can never be NULL.\nUse constructor initialization list when possible.\nMake more members const.\nOnly put the relevant code under \"if (mCblk !\u003d NULL)\".\nAdd comment about track name leak.\n\nChange-Id: Ib963390a69bed1999638cc982a759edd1d5f4712\n"
    },
    {
      "commit": "17a736c3e1d062d7fc916329eb32aef8935614af",
      "tree": "7fb73e48de8641ce6ad7b65fb4204bc60cd3e5f0",
      "parents": [
        "1746929ddc7592ab397c402724a61352e45df093"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 14 08:52:15 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 19 14:12:01 2012 -0700"
      },
      "message": "Update comments\n\nChange-Id: I327663a020670d0a72ff57bd0b682e2ce0528650\n"
    },
    {
      "commit": "a075db4ff9b086ac2885df77bb6da0869293df92",
      "tree": "2496dbf3d7fbb569b843780535bcea450157eb25",
      "parents": [
        "1746929ddc7592ab397c402724a61352e45df093"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 06 11:22:44 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 19 09:04:23 2012 -0700"
      },
      "message": "IAudioFlinger::createTrack and openRecord flags\n\ncreateTrack and openRecord don\u0027t need the \"old\" flags parameter,\nwhich was either audio_policy_output_t or audio_in_acoustics_t\nshifted left by 16 bits.  But they do need \"new\" flags, which\nare defined by the application use case.  Initially, the only\napplication use case flag is timed output, but others are planned.\n\nFor output, the audio_policy_output_t flags are passed to\nAudioSystem::getOutput, which returns an audio_io_handle_t, and that\nhandle is then passed to createTrack. So createTrack doesn\u0027t need the\nold flags parameter.\n\nFor input, the audio_in_acoustics_t flags are passed to\nAudioSystem::getInput, which returns an audio_io_handle_t, and that\nhandle is then passed to openRecord. So openRecord doesn\u0027t need the\nold flags parameter.\n\nChange-Id: I18a9870911846cca69d420c19fe6a9face2fe8c4\n"
    },
    {
      "commit": "e53b9ead781c36e96d6b6f012ddffc93a3d80f0d",
      "tree": "4bcde0bc9a797851ec1bee4f630c8c4f0735f623",
      "parents": [
        "b87396f9ebabbb7b47683bceca96cbe635a1ca00"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 12 16:29:55 2012 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 13 11:09:47 2012 -0700"
      },
      "message": "Whitespace and indentation\n\nFix indentation to be multiple of 4.\nMake it easier to search:\n  sp\u003c not sp \u003c to\n  \"switch (...)\" instead of \"switch(...)\" (also \"if\" and \"while\")\nRemove redundant blank line at start or EOF.\nRemove whitespace at end of line.\nRemove extra blank lines where they don\u0027t add value.\n\nUse git diff -b or -w to verify.\n\nChange-Id: I966b7ba852faa5474be6907fb212f5e267c2874e\n"
    },
    {
      "commit": "73f4bc33e0d458933460250a47c64aa868c05f97",
      "tree": "556b3eb2a31d5a986ec7213dfac598aa821b2091",
      "parents": [
        "470aa50c36089fbe0427557f7cf4464dd26a1c52"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Mar 09 12:08:48 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 12 15:14:24 2012 -0700"
      },
      "message": "Inline applyVolume() into threadLoop_mix()\n\nAlso the declaration of applyVolume in PlaybackThread was dead.\n\nChange-Id: I4b1a9848d07d3d7f340baea05b17f667c78df868\n"
    },
    {
      "commit": "470aa50c36089fbe0427557f7cf4464dd26a1c52",
      "tree": "4daa77f30c176aa51be2337d52e21046b04c1f39",
      "parents": [
        "2d6ef93773465cd3e66146fac35050a472c589f7",
        "1998661fdb6b0b5ae103e047e3d653c5da1b99e3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 12 15:05:51 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 12 15:05:51 2012 -0700"
      },
      "message": "Merge \"Remove unnecessary friend declarations\""
    },
    {
      "commit": "2d6ef93773465cd3e66146fac35050a472c589f7",
      "tree": "2a4a9d42d5911e3f04712560014671ab742465ca",
      "parents": [
        "0643d428cebcfe885ec2777253d45ee6e05da6fe",
        "688aac7675f18bdd7bff13334759e20bc4e6c390"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 12 15:05:21 2012 -0700"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Mar 12 15:05:21 2012 -0700"
      },
      "message": "Merge \"Remove virtual from methods that don\u0027t need it\""
    },
    {
      "commit": "66fcab972e9218d47c58a915f391b2f48a09903a",
      "tree": "f0c7144368a2371c0032dac6e511d0a711296bae",
      "parents": [
        "d64f3a376536a993fe6d81730b8b7b738500435e"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 14:59:21 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 12 08:58:26 2012 -0700"
      },
      "message": "Merge dup code at thread entry and param change\n\nThis CL is mostly just cleanup, but there are a couple of fixes marked\n\"FIX\" below.\n\nMerge the duplicate code that was at the beginning of threadLoop() and\nafter a parameter change.  cacheParameters_l() is now called at entry to\nthreadLoop() and after any parameter change.  It re-calculates all values\nthat are derived from parameters, and caches them in instance variables.\n\nupdateWaitTime_l():\n - FIX activeSleepTime depends on mWaitTimeMs, which was initially set\n   to infinity.  updateWaitTime_l() was not called at entry to\n   threadLoop(), so activeSleepTime was not set correctly before the\n   first parameter change.\n\n - FIX reversed the order of calls after parameter change\n   for the same reason so that updateWaitTime_l() is called before\n   calculating values that are derived from wait time.\n\n - marked it private since now it\u0027s only called from DuplicatingThread\n\nChange-Id: If2607d2ed66c6893d910433e48208a93c41fb7e9\n"
    },
    {
      "commit": "18868c5db2f90309c6d11e5837822135e4a0c0fa",
      "tree": "58c7505f59a1a93ab729fc039aa5cb1eaa49652e",
      "parents": [
        "f2015b625cd6bea86da7401e725332c35b90e7cf"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 07 09:15:37 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Mar 09 15:32:22 2012 -0800"
      },
      "message": "Use audio_policy_output_flags_t consistently\n\nThis affects:\n - IAudioFlinger::openOutput\n - AudioTrack::AudioTrack\n - AudioTrack::set\n - apps that call these\n\nChange-Id: I26fb281bac6cb87593d17697bc9cb37a835af205\n"
    },
    {
      "commit": "688aac7675f18bdd7bff13334759e20bc4e6c390",
      "tree": "1c210a88c1cff71f1117b54fc347802ee7bdc390",
      "parents": [
        "083c154162c88a9f63aeaa10a4b52dd454bda9ff"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Mar 09 10:30:26 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Mar 09 12:48:18 2012 -0800"
      },
      "message": "Remove virtual from methods that don\u0027t need it\n\nChange-Id: I30e17e61aae25b036436c0e270313c80c43e5f06\n"
    },
    {
      "commit": "1998661fdb6b0b5ae103e047e3d653c5da1b99e3",
      "tree": "bddc97b4c0bfb6c5367f8189a328ac869a8f2759",
      "parents": [
        "083c154162c88a9f63aeaa10a4b52dd454bda9ff"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Mar 09 12:07:30 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Mar 09 12:18:48 2012 -0800"
      },
      "message": "Remove unnecessary friend declarations\n\nAdd comments to the remaining friends, so we know what is left if we\ndecide to remove them later.\n\nChange-Id: I1de929257dc4700960f77902cda3d303177c72cf\n"
    },
    {
      "commit": "53d76dbe7c55821e89d9da02e7a563f7fb45de87",
      "tree": "3d1b5bcc6724a00ae58939712be4b28d068225c9",
      "parents": [
        "f3c2e3bd65449b413c378219e08c71bf744cfbf3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Mar 08 12:32:47 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Mar 08 16:18:57 2012 -0800"
      },
      "message": "Replace hard-coded 3 by FCC_2 to simplify searches\n\nChange-Id: I92881d04e8378307f849fb343071a58d181a68b4\n"
    },
    {
      "commit": "fec279f5a0bfaa2a42e91ab6dfa0282baeee308b",
      "tree": "8ab1678442af7a516a6d12d34c42e2a3d43a7dd6",
      "parents": [
        "3dbe8acdeb2309eab0c22dd1c8d732c7e94d3413"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Mar 08 07:47:15 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Mar 08 07:52:57 2012 -0800"
      },
      "message": "Mixer status cleanup\n\nUse mPrevMixerStatus for DirectOutputThread also.\nRemove the MIXER_CONTINUE logic and use MIXER_IDLE instead.\nRename the field mixerStatus to mMixerStatus.\nRename local variable back to mixerStatus.\n\nChange-Id: I0a8145fc856c6c5ff8b784b6176ef3c4d8eb7408\n"
    },
    {
      "commit": "b071e9bc248865ef87a339044c0c5cbabfac175c",
      "tree": "caa0212392475dcd125d748f2eaf50f11b2b84d8",
      "parents": [
        "b279312a9038b9c5b9b05b31b1b1db86f748efd8"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 07 17:05:59 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 07 17:05:59 2012 -0800"
      },
      "message": "Cleanup DirectOutputThread::mActiveTrack\n\nRename activeTrack to mActiveTrack.\nRelease the reference earlier, at the end of threadLoop_mix().\nThis allows the field to be made private and to\n  move the declaration from PlaybackThread to DirectOutputThread.\n\nChange-Id: I02be7a254638f7d85e92aaf0002d20ca0092a5c3\n"
    },
    {
      "commit": "b279312a9038b9c5b9b05b31b1b1db86f748efd8",
      "tree": "0ee1b4441fada98495d4430ca5425b60f7187817",
      "parents": [
        "da6dd679c196f1e342ce41ee9839e87309563e13",
        "b81cc8c6f3eec9edb255ea99b6a6f243585b1e38"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 07 16:08:59 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Mar 07 16:08:59 2012 -0800"
      },
      "message": "Merge \"IAudioFlingerClient::ioConfigChanged param2 const\""
    },
    {
      "commit": "fa26a859bacb597587a8f49acfc3127351fa688c",
      "tree": "9139e6966ad0957fc5d4dd80cbc88f22a3767a17",
      "parents": [
        "a13ad6e84db128eadf23b154d3346f0bb473a5f7"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 06 11:28:04 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 07 11:04:55 2012 -0800"
      },
      "message": "Isolate references to outputTracks/mOutputTracks\n\nMove all references to DuplicatingThread::outputTracks and\nDuplicatingThread::mOutputTracks from the common threadLoop() into\nvirtual methods.  This allows them to be moved from PlaybackThread to\nDuplicatingThread, and to be marked private.\n\nAlso use vector assignment to copy mOutputTracks to outputTracks.\n\nChange-Id: Ieb1cf1ad36b8a65143e61e6c92a65fb43427e5e2\n"
    },
    {
      "commit": "a13ad6e84db128eadf23b154d3346f0bb473a5f7",
      "tree": "089693e18957e4d6bc0315fa79b0f88f5e3e0dbd",
      "parents": [
        "a3707a280177e934a1e0a15660d9176663b7fc17",
        "d4513b09123deebf8023b73a82d2d46d35806cea"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 07 10:44:29 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Mar 07 10:44:29 2012 -0800"
      },
      "message": "Merge \"Make applyVolume private to DirectOutputThread\""
    },
    {
      "commit": "d4513b09123deebf8023b73a82d2d46d35806cea",
      "tree": "bff4d188e7d9cbf5b5b542ac555f7b406e1ba46d",
      "parents": [
        "1465f0c3df04c3166155a852a6a5c10069c1fd0a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 06 15:52:35 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 07 10:40:43 2012 -0800"
      },
      "message": "Make applyVolume private to DirectOutputThread\n\nChange-Id: I7ca4a59505857cbd106b6f274c66e9580dead271\n"
    },
    {
      "commit": "a3707a280177e934a1e0a15660d9176663b7fc17",
      "tree": "56d975052ce6d0e50a21a7a7e23139bbf30f9eaa",
      "parents": [
        "1465f0c3df04c3166155a852a6a5c10069c1fd0a",
        "cbc52bfb3b51c81c945b1e35990324bde892829a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 07 10:38:12 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Mar 07 10:38:12 2012 -0800"
      },
      "message": "Merge \"Add comments about sequence for setting parameters\""
    },
    {
      "commit": "1465f0c3df04c3166155a852a6a5c10069c1fd0a",
      "tree": "e89c51678875afc1d9055550e8f2ef97806b338a",
      "parents": [
        "f8edf68a1e39da273eafe8c85bdbedc26636c4ec"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 06 11:23:32 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Mar 07 07:28:12 2012 -0800"
      },
      "message": "Merge the calls to prepareTracks_l\n\nChange-Id: I1dd759581333e2908d980180d44db7bf5ed6591d\n"
    },
    {
      "commit": "b81cc8c6f3eec9edb255ea99b6a6f243585b1e38",
      "tree": "a3cad338817394b18b441bbb3f31853bfd9ed4f5",
      "parents": [
        "f8edf68a1e39da273eafe8c85bdbedc26636c4ec"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Mar 01 09:14:51 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 06 16:43:19 2012 -0800"
      },
      "message": "IAudioFlingerClient::ioConfigChanged param2 const\n\nThe 3rd parameter (param2) to AudioFlingerClient::ioConfigChanged\nis used as an input.  So changed it from void * to const void *.\nIt is then cast to const OutputDescriptor *\nor const audio_stream_type_t * depending on the event.\n\nChange-Id: Ieec0d284f139b74b3389b5ef69c7935a8e5650ee\n"
    },
    {
      "commit": "f8edf68a1e39da273eafe8c85bdbedc26636c4ec",
      "tree": "99cf34fc2caead1b27a828bbf3d762902c9b5440",
      "parents": [
        "92b8360fe9c3174dc0edaaab4b746d8a3d3f831f",
        "012ca6b4f69fb24385025c0e84b8f816525a3032"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 06 16:22:30 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Mar 06 16:22:30 2012 -0800"
      },
      "message": "Merge \"Rename fields of AudioSessionRef\""
    },
    {
      "commit": "cbc52bfb3b51c81c945b1e35990324bde892829a",
      "tree": "240280d717db745f2e46d2688487afe6c55f61e2",
      "parents": [
        "92b8360fe9c3174dc0edaaab4b746d8a3d3f831f"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Mar 01 09:21:37 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 06 16:18:17 2012 -0800"
      },
      "message": "Add comments about sequence for setting parameters\n\nChange-Id: Iffa59a34c3c47bdc1d3234cdcb4d8ff99c102825\n"
    },
    {
      "commit": "438b036deaf4413503567a75a2861c000d21da5b",
      "tree": "05fe0bad8c24d4e7e95bf20a61bad745a62221e4",
      "parents": [
        "70a1577d42c6e222c98f0245e7b81b0e8bc238f7"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 06 11:24:48 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 06 12:46:21 2012 -0800"
      },
      "message": "Rename updateWaitTime since a lock is held\n\nChange-Id: I9bb978cbd0debf5b21676467060f72eebafea3e6\n"
    },
    {
      "commit": "012ca6b4f69fb24385025c0e84b8f816525a3032",
      "tree": "707f045a8e82983d1650184a4be92493133a3148",
      "parents": [
        "70a1577d42c6e222c98f0245e7b81b0e8bc238f7"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 06 11:22:01 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 06 11:43:55 2012 -0800"
      },
      "message": "Rename fields of AudioSessionRef\n\nChange-Id: I9f2a66094135c4ac6bec2d3e9db3ac5fbf988ede\n"
    },
    {
      "commit": "000f0e39b4d0c88441297a05ab5f8da6832c1640",
      "tree": "7305f3c498bbb3f326df3201074e5e631a1c95a6",
      "parents": [
        "4bce61f407d43b216c288a8d7b26fb5519853dba"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Mar 01 17:10:56 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Mar 05 11:01:10 2012 -0800"
      },
      "message": "threadLoop merge\n\nChange-Id: Id8e6330ac6be76f9c2debba94f856de87e2d98f7\n"
    },
    {
      "commit": "e8286332f3817a8b7cc4cfd8f6450a3913533660",
      "tree": "c783132bbe76feacb35e2c8804349c2c15be6745",
      "parents": [
        "848b6a8a4ccff424e382ce5e1d946da6ede580a0",
        "480b46802bef1371d5caa16ad5454fce04769c57"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 29 14:59:08 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 29 14:59:08 2012 -0800"
      },
      "message": "Merge \"Shorten thread names\""
    },
    {
      "commit": "3e07470f3b122097cacfe5b85cdb1359279a2f33",
      "tree": "01cd459b03e9384672466c7acdd7e14e9242fcd4",
      "parents": [
        "bc4b08ba67a0245e092aee8f08ba30ef22d421bf"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 18:40:35 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 29 14:52:54 2012 -0800"
      },
      "message": "Prepare for threadLoop merge - active tracks\n\nContinued work on making the copies of threadLoop more similar:\n - Remove alias for mActiveTracks in MixerThread and DuplicatingThread.\n - Pull in declaration of activeTrack in DirectOutputThread.\n - Remove redundant parameter of prepareTracks_l().\n - Comment prepareTracks_l().\n\nChange-Id: If1087c1902b454acec01ddfdd9f055f0ca7abf04\n"
    },
    {
      "commit": "bc4b08ba67a0245e092aee8f08ba30ef22d421bf",
      "tree": "adbf9c79aee788643f112a82269ccc7addb73494",
      "parents": [
        "91cda8bdf8358a8b977a44e016b60a70bc1a5ee9",
        "d805b718b1fd2d5407ef665c8d4bb42e63dc71a9"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 29 14:44:39 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 29 14:44:39 2012 -0800"
      },
      "message": "Merge \"Update AudioFlinger comments\""
    },
    {
      "commit": "c455fe9727d361076b7cead3efdac2d32a1a1d6d",
      "tree": "10f603fdaeb746bdb00bc43e567751109783db0a",
      "parents": [
        "8b20e9272d2f8d5160494de3212d66a399b3637f"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 29 07:07:30 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 29 11:36:54 2012 -0800"
      },
      "message": "mSuspend comments and usage\n\nEmphasize that playbackthread::mSuspend is a counter, not a bool\n\nChange-Id: I7188e56814e1c54dbc65e560f3627f138257d644\n"
    },
    {
      "commit": "d805b718b1fd2d5407ef665c8d4bb42e63dc71a9",
      "tree": "941a1104efc261d317b0d3b795b8825a6eed0922",
      "parents": [
        "a3873833d518e032138cf70188b6f33cd7acec3d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 15:42:48 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 29 07:01:44 2012 -0800"
      },
      "message": "Update AudioFlinger comments\n\nAdd comments to enum mixer_state\nNote side-effect of lockEffectChains_l\nFix a typo\n\nChange-Id: Ibd51678bac2193201cbcbe081ff5664046fbc494\n"
    },
    {
      "commit": "480b46802bef1371d5caa16ad5454fce04769c57",
      "tree": "50bc53de16466d73d177b8f19ff96e8b9774b730",
      "parents": [
        "a3873833d518e032138cf70188b6f33cd7acec3d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 12:30:08 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 16:38:09 2012 -0800"
      },
      "message": "Shorten thread names\n\nprctl(PR_SET_NAME) limits to 15 characters.  Before we had names like\n\"Binder Thread #\" and the counter was cut off :-( Also remove redundant\n\"thread\" at end of name; it\u0027s always a thread.\n\nChange-Id: I1f99c2730ba0787ed9b59c15914356cddf698e2f\n"
    },
    {
      "commit": "a17c820c556fddf7ddd96b82b3e9874e340ffafd",
      "tree": "410130682b9d03614ce01e3e5af6bb0a2073d25d",
      "parents": [
        "3f791be1032e6c4cc499598dd2be116db6fb33c3",
        "02fe1bf923bbe5789202dbd5810e2c04794562e6"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 07:21:09 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 28 07:21:09 2012 -0800"
      },
      "message": "Merge \"AudioFlinger const methods and parameters\""
    },
    {
      "commit": "fadb2c73fce479205432652530663e1e90fd546c",
      "tree": "255d5dc9cdbda67837cbb3a7907ecd797f6b305f",
      "parents": [
        "77f70f7de1977d7b0a9f9c37a25e34db16feb7b4",
        "01c4ebf6b794493898114a502ed36de13137f7e5"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 28 07:17:47 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 28 07:17:47 2012 -0800"
      },
      "message": "Merge \"AudioBufferProvider comments and cleanup\""
    },
    {
      "commit": "843a12d146bd64642bf85a4e56c274246e3893a6",
      "tree": "82aca30fbbcc5c40f41a75dc3205ce983c187059",
      "parents": [
        "acb364073e62acddced517f2edfe0326245b2af9",
        "8abf44d2f2bcd20a2835570efe89d89c19db426a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Feb 27 13:23:51 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Feb 27 13:23:51 2012 -0800"
      },
      "message": "Merge \"Fix tracking of hardware state for dump\""
    },
    {
      "commit": "02fe1bf923bbe5789202dbd5810e2c04794562e6",
      "tree": "0a3c1634d0e3b36e996a9be60540bf63b226f84e",
      "parents": [
        "37d825e72a6c606553a745da1212590a425996d3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 15:42:17 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 16:34:43 2012 -0800"
      },
      "message": "AudioFlinger const methods and parameters\n\nChange-Id: I93ec28024005ed23aa141518092a012a4a7c44c5\n"
    },
    {
      "commit": "37d825e72a6c606553a745da1212590a425996d3",
      "tree": "268310fe31b44c0eee84b1d91adfbbaff2103a76",
      "parents": [
        "5ce96d97feafc6989f6141bb2633eae3d87ddf28"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 07:21:48 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 16:02:24 2012 -0800"
      },
      "message": "Pull out duplicated copies of silent mode check\n\nAlso fix the error handling for the property_get.\n\nThis is part of preparation for the threadLoop() merge.\n\nChange-Id: I6405190ea18146d1271575e1dfe9f279e8f36b17\n"
    },
    {
      "commit": "01c4ebf6b794493898114a502ed36de13137f7e5",
      "tree": "7f663fdad4040a40411e79d837c14e52e11a65b9",
      "parents": [
        "d6fd85a157ce2054b2304e6d171fa87ae09c363d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 22 10:47:35 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 13:42:13 2012 -0800"
      },
      "message": "AudioBufferProvider comments and cleanup\n\nAdd comments about which methods implement the AudioBufferProvider interface.\n\nSimplified the definition of kInvalidPts.  \u003cstdint.h\u003e is very hard to work\nwith, there seems to be no way to use it reliably to get INT64_MAX without\nhaving a separate source file, which is ugly because it means kInvalidPts\nis not a compile-time constant.  So I just deleted AudioBufferProvider.cpp\nand used a hard-coded constant instead.\n\nAdded a default constructor for Buffer so that the fields aren\u0027t random\n(especially .raw which is used to determine if the buffer is valid).\n\nMake the pts for getNextBuffer default to kInvalidPTS so code that\ndoesn\u0027t need a pts doesn\u0027t have to specify a value.\n\nRename the parameter to AudioMixer::setBufferProvider to make it clearer.\n\nChange-Id: I87e7290884d4ed975b019f62d1ab6ae2bc5065a5\n"
    },
    {
      "commit": "8abf44d2f2bcd20a2835570efe89d89c19db426a",
      "tree": "29fc684b04d18621913145c807c4493f5b607d86",
      "parents": [
        "d6fd85a157ce2054b2304e6d171fa87ae09c363d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 02 14:16:03 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 13:31:26 2012 -0800"
      },
      "message": "Fix tracking of hardware state for dump\n\nAt end of AudioFlinger::onFirstRef(), the hardware status was being left\nin wrong state.  It should be AUDIO_HW_IDLE but was AUDIO_HW_INIT.\n\nmHardwareStatus was being set to AUDIO_HW_OUTPUT_OPEN too early, and so\na return would leave it in the wrong state until next hardware operation.\n\nTake the hardware lock for dev-\u003eget_parameters, and update mHardwareStatus\nbefore and after.\n\nKeep hardware lock only for the duration of the dev-\u003eset_parameters.\n\nRename two constants in enum hardware_call_state to have the prefix\nAUDIO_HW so they follow the naming conventions.\n\nAdd comments.\n\nChange-Id: I6c7450b11f9b13adaeef9cec874333e478a58fc0\n"
    },
    {
      "commit": "5cf034d92d901169ca6e36c90475f40715827fcd",
      "tree": "7a6d8c982f699f2e8a8ea0cfd0088dfdada23399",
      "parents": [
        "d6fd85a157ce2054b2304e6d171fa87ae09c363d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 21 10:35:56 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 24 13:14:28 2012 -0800"
      },
      "message": "Remove TrackBase::mFlags\n\nThe bit-field TrackBase::mFlags was supposed to have track-specific\nflags in the upper 16 bits, and system flags in the lower 16 bits.\n\nThe upper 16 bits of mFlags were initialized in the TrackBase\nconstructor from the flags parameter of IAudioFlinger::createTrack()\nand IAudioFlinger::openRecord(), and the lower 16 bits were cleared.\n\nHowever, the upper 16 bits of mFlags were never acccessed again.\nSo really there are no track-specific flags.  I left the flags\nin the parameter list of createTrack() and openRecord() but made a\nnote that these should be removed eventually as they are dead.\n\nThis leaves only the one system flag \"step server failed\".  I replaced\nthe bit-field mFlags by bool mStepServerFailed, which is simpler and\nslightly faster.\n\nChange-Id: I6650f5487be72791b4a67d73adcd10ffa04e2aa5\n"
    },
    {
      "commit": "9eaa55756c5b245970447019250ce852f5189525",
      "tree": "68428af4a3b22a62f9c09a2c4c7b8a8a95a936fd",
      "parents": [
        "2e77ad2a9f7afb57b6f9127dd7c229e774baa9c8"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 20 13:32:16 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 22 13:19:26 2012 -0800"
      },
      "message": "Avoid wp\u003c\u003e::unsafe_get() with a few exceptions\n\nAvoid using wp\u003c\u003e::unsafe_get() except in a log, and other specific cases\nwhen it\u0027s known to be safe.\n\nUse more specific subclass types for parameters to avoid down-casts.\n\nWhen a constructor or method parameter is \"this\" of an object that is\ncurrently being constructed, it\u0027s better to use a raw pointer rather\nthan either sp\u003c\u003e or wp\u003c\u003e.\n\nUsing the raw pointer is safe, provided either:\n - it is \"this\" of an object being constructed (which has sp\u003c\u003e refcount of 0),\n - or the caller already holds an sp\u003c\u003e\n\nThe raw pointer is simpler and faster, and it avoids the problem of the\nsp\u003c\u003e reference count being incremented and then decremented to zero on\nscope exit, which would cause the object\u0027s destructor to run while the\nobject is still being constructed.\n\nAlso removed some dead code per a review comment.\n\nChange-Id: I7375f64da3aec11b928c33cb01faff186252ef5e\n"
    },
    {
      "commit": "a111792f1314479c649d1d44c30c2caf70c00c2a",
      "tree": "f67b5f32a61a259f292b7d0d992f31b8e2ff857c",
      "parents": [
        "761defc341c5ce9019a42919c441f035f665ec0d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 10:53:32 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 17 09:39:07 2012 -0800"
      },
      "message": "Simplify code\n\nUse DefaultKeyedVector::valueFor to avoid extra test\nMake local variables as local as possible\nNo double parentheses\nNo typedef for single use\nNo parentheses around indirect function call\nNo AudioFlinger:: prefix when not needed\nRemove unnecessary casts\nRemove block with only one line\n\nSaves 128 bytes\n\nChange-Id: I3a87430eeb01b81e7b81a1c38f6fdd3274ec48f3\n"
    },
    {
      "commit": "4ff14bae91075eb274eb1c2975982358946e7e63",
      "tree": "e9e54fddb9832d30b69c2a11c9ed2884397f2f95",
      "parents": [
        "951bd8d1ad9581a414e171ad8605a9515d0ad667"
      ],
      "author": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Wed Feb 08 16:37:41 2012 -0800"
      },
      "committer": {
        "name": "John Grossman",
        "email": "johngro@google.com",
        "time": "Thu Feb 16 13:45:11 2012 -0800"
      },
      "message": "Upintegrate Audio Flinger changes from ICS_AAH\n\nBring in changes to audio flinger made to support timed audio tracks\nand HW master volume control.\n\nChange-Id: Ide52d48809bdbed13acf35fd59b24637e35064ae\nSigned-off-by: John Grossman \u003cjohngro@google.com\u003e\n"
    },
    {
      "commit": "6dad4378f2a78d967defc8912ecf47f6ed117584",
      "tree": "fb4fa4804cfa198fe6a625993c7cff520a492be8",
      "parents": [
        "d9b9b8d09e7471b0ffa21cfa9f944ef4ad300a71",
        "6637baae4244aec731c4014da72418d330636ae1"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 14 09:44:47 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Feb 14 09:44:47 2012 -0800"
      },
      "message": "Merge \"Fix races related to volume and mute\""
    },
    {
      "commit": "99e53b86eebb605b70dd7591b89bf61a9414ed0e",
      "tree": "8939550ada02fe21121550a83952ebf7638c0dac",
      "parents": [
        "6dbc1359f778575d09d6da722b060a6d72c2e7c5"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 19 08:59:58 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 14 09:17:59 2012 -0800"
      },
      "message": "Update comments\n\nWe no longer put the filename at start of file.\n\nChange-Id: Ic435b159a23105681e3d4a6cb1ac097bc853302e\n"
    },
    {
      "commit": "6dbc1359f778575d09d6da722b060a6d72c2e7c5",
      "tree": "721c46e8b89595b51a80ee71c71542895edc1308",
      "parents": [
        "7a8b0ed6419e57dd8b41d3806893d63d3df91aab"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 02 10:56:47 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Feb 14 07:30:48 2012 -0800"
      },
      "message": "AudioRecord and AudioTrack client tid\n\nInform AudioFlinger of the tid of the callback thread.\n\nChange-Id: I670df92dd06749b057238b48ed1094b13aab720b\n"
    },
    {
      "commit": "2b213bc220768d2b984239511cd4554a96bc0079",
      "tree": "06053ae20ae309df04caa0ad5a63563fe72f5a15",
      "parents": [
        "b6333aa8317ce5162ab006c4baed6b0890936dc7"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 02 14:05:20 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:36:46 2012 -0800"
      },
      "message": "mAudioHwDevs and related cleanup\n\nInline AudioFlinger::initCheck and remove unnecessary lock.\n\nRemove redundant check of mAudioHwDevs.size().\n\nNo need to lock mHardwareLock for each device separately\nduring initialization.\n\nUse size_t not int to loop through Vector, since size() returns size_t.\n\nAdd missing hardware lock for get_mic_mute() and get_input_buffer_size().\n\nAdd comments.\n\nChange-Id: Iafae78ef78bbf65f703d99fcc27c2f4ff221aedc\n"
    },
    {
      "commit": "b6333aa8317ce5162ab006c4baed6b0890936dc7",
      "tree": "d4fb7b888a6b12f4d3c35c0a84d49490dc33bc8e",
      "parents": [
        "3a144d08b713e3c0f6b7b8e95bc42cef5886f4fa",
        "b28686f95daee16edeb5f39af2cd5274ac3dc99f"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:32:16 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 15:32:16 2012 -0800"
      },
      "message": "Merge \"Simplify ThreadBase::exit() aka requestExitAndWait\""
    },
    {
      "commit": "0d9302d7830b46542821b3e5f3e4f96942bd3cb3",
      "tree": "f14d8a8e3a243dc6fa7d63d48017132814ff3b86",
      "parents": [
        "858df80948ee64f478782a6a6c06533ba1651ef1",
        "2f732eb768004c6362fae8a02c60b69c9400b032"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:31:07 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 15:31:07 2012 -0800"
      },
      "message": "Merge \"Move header declarations around for clarity\""
    },
    {
      "commit": "858df80948ee64f478782a6a6c06533ba1651ef1",
      "tree": "d5b854a26e507ab8ce03037371146e5a34937151",
      "parents": [
        "95a87908ddf240760e8e8b35a6cafcc149c7f33f",
        "58123c3a8b5f34f9d1f70264a3c568ed90288501"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:30:15 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 15:30:15 2012 -0800"
      },
      "message": "Merge \"Camel case readability \u0026 private disconnect(bool)\""
    },
    {
      "commit": "b28686f95daee16edeb5f39af2cd5274ac3dc99f",
      "tree": "84d9f579f42b724ca4c1dce405f3c8a5901e9d9d",
      "parents": [
        "7ae4a2c130ec2cb5dec69d095b810698acc543b3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 06 08:39:38 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 15:02:44 2012 -0800"
      },
      "message": "Simplify ThreadBase::exit() aka requestExitAndWait\n\nWe can remove mExiting and use Thread::exitPending() instead.\n\nThe local sp\u003c\u003e on \"this\" in exit() is not needed, since the caller must\nalso hold an sp\u003c\u003e in order to be calling us. (Unless it was using a raw\npointer, but that would be dangerous for other reasons.)\n\nAdd comment explaining the mLock in exit().\n\nChange-Id: I319e5107533a1a7cdbd13c292685f3e2be60f6c4\n"
    },
    {
      "commit": "12018d80add66f5558675614d73fa6549150806e",
      "tree": "8fbeaafce1f62e72edcef8d43a6a435fb3fe301c",
      "parents": [
        "8b5980798ca06e57b1284e6e23fa220e1207bf41",
        "b7bf796b758e144f94f6ed4d16c21bf22a118fb3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 10 13:33:31 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 10 13:33:31 2012 -0800"
      },
      "message": "Merge \"Move declaration of stream_type_t up earlier\""
    },
    {
      "commit": "2f732eb768004c6362fae8a02c60b69c9400b032",
      "tree": "e47161097aae718d7496059fd53b0238f3627a53",
      "parents": [
        "7ae4a2c130ec2cb5dec69d095b810698acc543b3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 09:48:03 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 09 17:29:26 2012 -0800"
      },
      "message": "Move header declarations around for clarity\n\nPut IAudioFlinger methods in binder opcode order.\nMove hardware call state closer to where it is used.\ngetMode() and btNrecIsOff() are private.\n\nChange-Id: Ie50340b396c39c763f2b155cbc08da8a0d0f2424\n"
    },
    {
      "commit": "58123c3a8b5f34f9d1f70264a3c568ed90288501",
      "tree": "19111bc4d31bd66596fc47272fe778f1ea1af9d9",
      "parents": [
        "98ec94c5854daccc3474758524e7f4adfe535ce0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 10:32:24 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Feb 09 16:43:39 2012 -0800"
      },
      "message": "Camel case readability \u0026 private disconnect(bool)\n\nChange-Id: If66516ed2703e048c5e6ccc6cd431446a024f4a1\n"
    },
    {
      "commit": "6637baae4244aec731c4014da72418d330636ae1",
      "tree": "5244135379ecfdd8ce7394ccfed0b363ccabcf56",
      "parents": [
        "98ec94c5854daccc3474758524e7f4adfe535ce0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 09 09:40:36 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 17:01:49 2012 -0800"
      },
      "message": "Fix races related to volume and mute\n\nFix race conditions when setting master volume, master mute, stream\nvolume, stream mute for a playback thread, and when reading stream\nvolume of a playback thread.  Lock order is AudioFlinger, then thread.\n\nRename streamVolumeInternal to streamVolume_l, comment, and use it to\nimplement streamVolume().\n\nCode size reduction:\n - Remove dead code: AudioFlinger::PlaybackThread::masterVolume, masterMute, streamMute.\n - Change return type of non-binder methods that always succeed from status_t to void.\n - Remove virtual from volume and mute methods that don\u0027t need it.\n\nThis change saves 228 bytes but decreases performance of binder operations\ndue to the added locks.\n\nChange-Id: Iac75abc1f54784873a667d1981b2e08f8f31e5c9\n"
    },
    {
      "commit": "b7bf796b758e144f94f6ed4d16c21bf22a118fb3",
      "tree": "ae407de10945e65b4092455db41ae6b8b3c8462c",
      "parents": [
        "98ec94c5854daccc3474758524e7f4adfe535ce0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 12:36:25 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 12:54:31 2012 -0800"
      },
      "message": "Move declaration of stream_type_t up earlier\n\nstream_type_t is used by AudioFlinger class, so it should be declared there.\nThis way we don\u0027t have to peek into PlaybackThread to get the declaration.\n\nChange-Id: Ie08bab1604699214d1e8df2d48d3fbfbbc436e96\n"
    },
    {
      "commit": "02bbd20cece1785c223ac4ca2ddc635931a80673",
      "tree": "f43adecd4648ff511eacc7ca2921c167ed3220de",
      "parents": [
        "98ec94c5854daccc3474758524e7f4adfe535ce0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 12:35:35 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 12:52:00 2012 -0800"
      },
      "message": "Rename type() to streamType()\n\nThis avoids possible confusion with thread\u0027s type().\nAlso remove redundant cast \"(audio_stream_type_t)\".\n\nChange-Id: I320b9177b6c267a102d215f002228bcf988c437a\n"
    },
    {
      "commit": "98ec94c5854daccc3474758524e7f4adfe535ce0",
      "tree": "bec80965e65828ee2f890d25c275fd3bf422eb45",
      "parents": [
        "72ef00de10fa95bfcb948ed88ab9b7a177ed0b48"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jan 25 14:28:29 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 10:24:54 2012 -0800"
      },
      "message": "Combine duplicate code \u0026 document wp\u003c\u003e in mClients\n\nChange-Id: Iea8cfe8e57563337fb2484a1246ef79d6ad3db18\n"
    },
    {
      "commit": "72ef00de10fa95bfcb948ed88ab9b7a177ed0b48",
      "tree": "beeaffd33a57a6cc5fa48f2fa905fc680c4746d1",
      "parents": [
        "dbfafaffe2e97eaf8d74ec6b6c468418a1ad2443"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 17 11:09:42 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 10:06:32 2012 -0800"
      },
      "message": "Use audio_io_handle_t consistently instead of int\n\nOther:\n - add a comment to nextUniqueId\n - made ThreadBase::mId const, since it is only assigned in constructor.\n\nChange-Id: I4e8b7bec4e45badcde6274d574b8a9aabd046837\n"
    },
    {
      "commit": "5e92a7861196ddae14638d4b7a63fc4892b7ef59",
      "tree": "6772b944a26acb22381a2eb38871b46cff9d856a",
      "parents": [
        "0a20fa9c41c96e31fa20e071074a4b6e7f6c41c3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 07:40:52 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 09:21:39 2012 -0800"
      },
      "message": "Effect UUID inputs passed by pointer are const\n\nChange-Id: I1f5c338bcb7368e3dd8cd5f804b2e6d9fbe087f8\n"
    },
    {
      "commit": "63d2daed17ab749baa80bc808fb5083b688b771b",
      "tree": "735cfc77d2082c044816fe367f33401fd5b472c7",
      "parents": [
        "4f9b0c54011eb8fd2ccfb393c2dcd51cd07800e0",
        "c59c004a3a6042c0990d71179f88eee2ce781e3c"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 08:39:39 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 08 08:39:39 2012 -0800"
      },
      "message": "Merge \"AudioFlinger methods const and inline\""
    },
    {
      "commit": "86feafe15b3f9609e1e9f64184688c2b6f2e4834",
      "tree": "281f6c3826240aeabc62820918b9e206a6cfb76e",
      "parents": [
        "e616d4e6de6d53ddebbc3d7fb381af94589c2232",
        "c19e22450e6e3d07594c935c7a9522e85e909e82"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 08:33:41 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 08 08:33:41 2012 -0800"
      },
      "message": "Merge \"Use virtual destructors\""
    },
    {
      "commit": "e98bbd36d67243fe987b09904956550a68af1cc7",
      "tree": "3ad396f50bb4ad8e1bbf9fa939c4978851ec998b",
      "parents": [
        "dfa75555098a385ac8f4d29a73b32d66501f133d",
        "f587ba5b991c7cd91e4df093d0d796bd419e5d67"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Feb 08 07:39:27 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Wed Feb 08 07:39:27 2012 -0800"
      },
      "message": "Merge \"Declare more IAudioFlinger methods const\""
    },
    {
      "commit": "d5e54f7a36daedc3b2a642d1499c262da04e6280",
      "tree": "9a56f54d6431ad2f7f0d2c6817f1e9f568bca769",
      "parents": [
        "787bae0578fbaab6219ebf23494866b224d01438"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 09:50:01 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 16:09:30 2012 -0800"
      },
      "message": "Remove dead code\n\nmFormat is unused in resampler\nmClientTid is unused\nlocal variable pid is unused in dump\n\nChange-Id: Ib156e38029366620bfeff2a13e73471867155a5b\n"
    },
    {
      "commit": "f587ba5b991c7cd91e4df093d0d796bd419e5d67",
      "tree": "0fe274cdfa6dcae81617725b5ea376c86245b104",
      "parents": [
        "787bae0578fbaab6219ebf23494866b224d01438"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 16:25:10 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 15:40:56 2012 -0800"
      },
      "message": "Declare more IAudioFlinger methods const\n\nThis is just documentation, as C++ method const-ness doesn\u0027t mean anything\nfor a binder API.  Instead, here const means \"no side effects\".\n\nChange-Id: Iaa9cd2fe477db10ae9a40cac4f79f0faa9b4e5e6\n"
    },
    {
      "commit": "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": "787bae0578fbaab6219ebf23494866b224d01438",
      "tree": "935422276579d6f7c3b4e835e1a79bc9082a2b26",
      "parents": [
        "ff3c83e04ae459c4252b86dd4440b4e37ee92c16",
        "de9719b3ec71472e6bf75117152176af51d1a515"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 08:31:01 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 03 08:31:01 2012 -0800"
      },
      "message": "Merge \"Use audio_in_acoustics_t consistently\""
    },
    {
      "commit": "87f155d6655b2d3b27e69281a29e85c6407e4d26",
      "tree": "65032f39295f3fd280d8478bdc25a14b5362847d",
      "parents": [
        "f81e97e4ec8b01965a5b36987f886cf5001f71ff",
        "d05397144be774f2f3623c754e865f51753e4e31"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 07:46:42 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 03 07:46:42 2012 -0800"
      },
      "message": "Merge \"For performance, return large objects by reference\""
    },
    {
      "commit": "84afa3b51ac48f84ed62489529ce78cba7fca00e",
      "tree": "ee9ba57cdc17668c9362b70f6bfbfcbd40a253ad",
      "parents": [
        "5c0ad10b14ec2287f90f95912d98e66eef006e2a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jan 25 15:28:08 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 07:37:14 2012 -0800"
      },
      "message": "Constructor initialization and const fields\n\nIn constructors, initialize member fields in the initialization list\nrather than constructor body where possible.  This allows more fields\nto be const, provided they are never modified.\n\nAlso initialize POD fields in constructor, unless it\u0027s obvious they\ndon\u0027t need to be initialized.  In that case, put a comment instead.\n\nRemove explicit clear() in destructors on fields that are now const.\n\nGive AudioSessionRef a default constructor, so it\u0027s immutable fields can\nbe marked const.\n\nAdd comment about ~TrackBase() trick.\n\nInitialize fields in declaration order to make it easier to confirm that\nall fields are set.\n\nMove initialization of mHardwareStatus from onFirstRef() to constructor.\n\nUse NULL not 0 to initialize raw pointers in initialization list.\n\nRename field mClient to mAudioFlingerClient, and getter from client()\nto audioFlingerClient().\n\nChange-Id: Ib36cf6ed32f3cd19003f40a5d84046eb4c122052\n"
    },
    {
      "commit": "5c0ad10b14ec2287f90f95912d98e66eef006e2a",
      "tree": "b11958235c122442a9dd1af28ad054e1e5046a79",
      "parents": [
        "62da7fbd60bee2dd57f503126266e9f04311d400",
        "23bb8becff20449a9b1647d5a1a99b14c83f0cce"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 07:26:28 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Feb 03 07:26:28 2012 -0800"
      },
      "message": "Merge \"Cleanup thread types\""
    },
    {
      "commit": "d05397144be774f2f3623c754e865f51753e4e31",
      "tree": "da598c09f36ce72672b7acec33516dbd9103e172",
      "parents": [
        "fd267d7cf640225bb57f0ed1af44efc153275f6d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 12:56:03 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 13:01:17 2012 -0800"
      },
      "message": "For performance, return large objects by reference\n\nChange-Id: Ibf737018ef1d3c7d717584615dcb2d4ecdb50c99\n"
    },
    {
      "commit": "435dbe6c3ecd04bcb4bd80584064e287ebccd720",
      "tree": "aa42e717d186dc84491e03c675c8c93683407fcf",
      "parents": [
        "fd267d7cf640225bb57f0ed1af44efc153275f6d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 10:15:48 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 30 10:31:09 2012 -0800"
      },
      "message": "Fix const sp\u003c\u003e\u0026 in parameter list and return value\n\nEffectModule::addHandle and Client::heap() were declared incorrectly.\n\nAs a parameter, an sp\u003c\u003e should be \u0026 for efficiency, and for input\nparameters it should also be const to protect the caller\u0027s value.\n\nBut as a return value, an sp\u003c\u003e should have neither const or \u0026.  The \"e\"\nin \"return e;\" might be located on the stack, and if there is \"\u0026\" then\nthe caller would see the address of a variable which no longer exists.\nAlso, an \u0026 would make it hard to do \"return 0;\".\nA \"const\" without \u0026 is meaningless in the return type.\n(In this particular case, the \"e\" is a member field, so it was safe.)\n\nChange-Id: I3df5f294214eb15a9d4d596c6d5ef29de97b5c27\n"
    },
    {
      "commit": "de9719b3ec71472e6bf75117152176af51d1a515",
      "tree": "d745196f8aa6832a18e380d78ad1bd1eae1e9e8f",
      "parents": [
        "a3a2cd4072aaa2d93c91251a786eb7323f8d2c27"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 12:32:34 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 13:31:54 2012 -0800"
      },
      "message": "Use audio_in_acoustics_t consistently\n\nChange-Id: I0a9dd668fb2e57b1c3ece3190588194974b99062\n"
    },
    {
      "commit": "a3a2cd4072aaa2d93c91251a786eb7323f8d2c27",
      "tree": "188f6115eb45ac32f182d53540c76dae63cf4917",
      "parents": [
        "6f5980b75df837231365d238c1b0d6f386363fbb",
        "aed850d0d3b3c8cf3feaf1438076f33db2a60946"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 07:22:30 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jan 27 07:22:30 2012 -0800"
      },
      "message": "Merge \"AudioStreamIn and AudioStreamOut\""
    },
    {
      "commit": "6f5980b75df837231365d238c1b0d6f386363fbb",
      "tree": "a0e71b7150016bfd7763572c272b11b33aa13985",
      "parents": [
        "28f52c84c22e129063a576e1269a39ae0cc0bfb3",
        "90716c5728b37637b2d0a730a721bfc9fad299e0"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 07:19:53 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jan 27 07:19:53 2012 -0800"
      },
      "message": "Merge \"Declare methods in binder opcode order\""
    },
    {
      "commit": "28f52c84c22e129063a576e1269a39ae0cc0bfb3",
      "tree": "c64b35e8b205295cc6f2503bbb8520868e01fc8a",
      "parents": [
        "114c458f2b80a252ec627add1d5fda2093c79068",
        "28243dd563fee1c82f0fff6cc27b5cbf21fa2585"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 07:19:10 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jan 27 07:19:10 2012 -0800"
      },
      "message": "Merge \"Use enum effect_state consistently\""
    },
    {
      "commit": "114c458f2b80a252ec627add1d5fda2093c79068",
      "tree": "3f676423666da814f847dc7944d223cb5a5bbe9c",
      "parents": [
        "37770e47b63038178e1d8bdb9f14785a86e9e858",
        "b853e986caf43408ad95b9014f194aadff385e3c"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 27 07:18:23 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Fri Jan 27 07:18:23 2012 -0800"
      },
      "message": "Merge \"Use enum track_state consistently\""
    },
    {
      "commit": "aed850d0d3b3c8cf3feaf1438076f33db2a60946",
      "tree": "78a7f2a4ce61fc7514fd3c18ac7805c488945407",
      "parents": [
        "2857b47a2731579772c76d46285660972c0ba23d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 09:46:34 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 15:58:07 2012 -0800"
      },
      "message": "AudioStreamIn and AudioStreamOut\n\nThese are immutable, so make the fields const.\ngetOutput() and getInput() methods are now const.\n\nChange-Id: I128246ebd56ea50b3e542be43f2aa1bcb55f1373\n"
    },
    {
      "commit": "23bb8becff20449a9b1647d5a1a99b14c83f0cce",
      "tree": "461647a589f80192679b52f210524c74cce4fb57",
      "parents": [
        "2857b47a2731579772c76d46285660972c0ba23d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 10:38:26 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 15:45:12 2012 -0800"
      },
      "message": "Cleanup thread types\n\nUse type_t instead of int for thread types.\nInitialize ThreadBase::mType in constructor and make it const.\n\nChange-Id: I43d141388b9639e4783c30b97dbda5688bf7555f\n"
    },
    {
      "commit": "90716c5728b37637b2d0a730a721bfc9fad299e0",
      "tree": "5c92855ca40d1de7f6dc5ad14ad16d54b87137c8",
      "parents": [
        "80a0d2de0a7db5cdcaf40fe33b14523b65d19423"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 13:40:12 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 14:34:30 2012 -0800"
      },
      "message": "Declare methods in binder opcode order\n\nThis makes it easier to compare interface and implementation.\n\nChange-Id: Ie060e43dec348902abcf40f5a610cec639d6d0d3\n"
    },
    {
      "commit": "29c23c3aee5ae799b3480dc6876a46c46b019710",
      "tree": "5303f312a95c76fb3df14f22e91a28e6a32f54f8",
      "parents": [
        "2857b47a2731579772c76d46285660972c0ba23d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 13:37:52 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 14:23:47 2012 -0800"
      },
      "message": "Use enum mixer_state consistently\n\nChange-Id: I5b71ed20f939dfc4b98143334b7aa064d282f584\n"
    },
    {
      "commit": "28243dd563fee1c82f0fff6cc27b5cbf21fa2585",
      "tree": "222f107b8674ef82b42328fce2b464134e22e155",
      "parents": [
        "2857b47a2731579772c76d46285660972c0ba23d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 13:43:46 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Jan 26 14:20:34 2012 -0800"
      },
      "message": "Use enum effect_state consistently\n\nAlso fix indentation\n\nChange-Id: I393ef9e37ffceed5ad4a78df439726ae1fe139df\n"
    }
  ],
  "next": "b853e986caf43408ad95b9014f194aadff385e3c"
}
