)]}'
{
  "log": [
    {
      "commit": "5a8a95de6dad1a3bcf3da5a37b35766e89086e13",
      "tree": "64b82016eaef26f51b75470714172c06287c9c56",
      "parents": [
        "ea44f41bb142555e747cc11382296e94af99d312"
      ],
      "author": {
        "name": "Ricardo Garcia",
        "email": "rago@google.com",
        "time": "Sat Apr 18 14:47:04 2015 -0700"
      },
      "committer": {
        "name": "Ricardo Garcia",
        "email": "rago@google.com",
        "time": "Wed Apr 22 10:57:24 2015 -0700"
      },
      "message": "Use AudioPlaybackRate to hold TimestretchBufferProvider parameters\n\nUse this struct to handle the parameters for TimestretchBufferProvider all\nacross the system.\nAdd stretch mode and fallback mode to TimestretchBuffer Provider.\n\nChange-Id: I19099924a7003c62e48bb6ead56c785cb129fba2\n"
    },
    {
      "commit": "8edb8dc44b8a2f81bdb5db645b6b708548771a31",
      "tree": "663bda0f8a3d43894fa6d3d3f4283ed0df427f03",
      "parents": [
        "c5656cc900aeb4a705e27508dd82c70030a97709"
      ],
      "author": {
        "name": "Andy Hung",
        "email": "hunga@google.com",
        "time": "Thu Mar 26 19:13:55 2015 -0700"
      },
      "committer": {
        "name": "Andy Hung",
        "email": "hunga@google.com",
        "time": "Thu Apr 09 18:49:15 2015 -0700"
      },
      "message": "Add playback rate to AudioTrack\n\nBug: 19196501\nChange-Id: I6411e1d3ce652b711a71a6d9df020cb5f60d4714\n"
    },
    {
      "commit": "f59497bd3c190e087202043de5450ef06e92b27d",
      "tree": "52ff88a5a4bd358358850e0ca16d0f9527fded4e",
      "parents": [
        "802a568f77b9a372537e4216b2a7cbb203958a87"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 26 16:35:47 2015 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Mar 13 16:22:16 2015 -0700"
      },
      "message": "Update comments\n\nChange-Id: I37d3c4ce22b74fe8581a886fe5a7f9fef8266dad\n"
    },
    {
      "commit": "a18eb9ea913e2cd19df9fe0f1b2a667339006581",
      "tree": "7d0c82041083a9f39525c98ac0c7fb6ccbd55756",
      "parents": [
        "b60bf91d2b1b2e45166cbb1eff9499de8b1c1105",
        "53dbe77b9f50cdd0de88b9d25dd643e90c8ba68b"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jan 12 16:15:00 2015 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Mon Jan 12 16:15:01 2015 +0000"
      },
      "message": "Merge \"Move roundup from frameworks/av to system/media\""
    },
    {
      "commit": "53dbe77b9f50cdd0de88b9d25dd643e90c8ba68b",
      "tree": "c69d11cf3119aaa816cea8a59cc0b63f52a53e69",
      "parents": [
        "81879df8dc51df4d8a3880349e9e1e6b5e3cebfb"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 06 10:46:38 2015 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jan 07 09:12:17 2015 -0800"
      },
      "message": "Move roundup from frameworks/av to system/media\n\nChange-Id: I1083ab739e445e5bd3e3082fc1d3a20cc19601d5\n"
    },
    {
      "commit": "4ede21d9c1f957baf5e561849ff9bbe4bcbefc20",
      "tree": "7a30e810c5dc2da9c03d1561a81bd4e00321097c",
      "parents": [
        "9b4615887c23548438fd0d8e3d8f04ac21912850"
      ],
      "author": {
        "name": "Andy Hung",
        "email": "hunga@google.com",
        "time": "Fri Dec 12 15:37:34 2014 -0800"
      },
      "committer": {
        "name": "Andy Hung",
        "email": "hunga@google.com",
        "time": "Tue Jan 06 11:59:11 2015 -0800"
      },
      "message": "Fix loop and position restoration in static AudioTracks\n\nAllow restoration of loop and position.\nMake position and loop synchronously readable.\n\nBug: 17964637\nChange-Id: I8cfb5036e665f55fdff5c67d27e1363ce9a8665d\n"
    },
    {
      "commit": "9b4615887c23548438fd0d8e3d8f04ac21912850",
      "tree": "63c96e7a84c2e7c942711f3aa6d4d05c4d0f3345",
      "parents": [
        "b126b43fcbfe10643245396fcae462c541a94ccf"
      ],
      "author": {
        "name": "Andy Hung",
        "email": "hunga@google.com",
        "time": "Mon Dec 01 17:56:29 2014 -0800"
      },
      "committer": {
        "name": "Andy Hung",
        "email": "hunga@google.com",
        "time": "Mon Jan 05 15:12:43 2015 -0800"
      },
      "message": "Fix loop and position setting in static AudioTracks\n\nAllow independent setting of position and loop.\n\nBug: 17964637\nChange-Id: I8b3bd97a244b932728b68da7684044f2636984a5\n"
    },
    {
      "commit": "b187de1ada34a9023c05d020a4592686ba761278",
      "tree": "31dea84d078f6198ce17ca856fcbb76c402f37b6",
      "parents": [
        "64cbdee08a18b25448a5fb0b058d3b83d5630d7f"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Dec 30 08:18:15 2014 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Dec 30 08:18:15 2014 -0800"
      },
      "message": "Line length 100\n\nChange-Id: I6c8fe626a3825fa9e139319656d682a57b887c97\n"
    },
    {
      "commit": "cb2129b3b568a4e31bcbda3545a468024bc972fe",
      "tree": "87f7c1114770b59e3a6166e7adbb3bcdea8601d2",
      "parents": [
        "97e6ca1a0be83e420ab238d9a1c31d3112126646"
      ],
      "author": {
        "name": "Andy Hung",
        "email": "hunga@google.com",
        "time": "Tue Nov 11 12:17:22 2014 -0800"
      },
      "committer": {
        "name": "Andy Hung",
        "email": "hunga@google.com",
        "time": "Tue Nov 18 17:15:51 2014 -0800"
      },
      "message": "Fix missing loop count for static tracks.\n\nStaticAudioTrackServerProxy::framesReady() previously returned\nonly the contiguous frames, update to return the total\navailable frames. This resolves short-count looping in\nSoundPool for FastTracks.\n\nAlso (1) Removes the racy condition of reading two variables\nand (2) Fixes buffer-\u003emNonContig to return the correct value\nand (3) Restores behavior that loop count of 1 goes back to\nloopStart once during playback.\n\nBug: 11830751\nBug: 12070295\nBug: 17456842\nChange-Id: I64906e6036bb00a1d7375b03efe6deb69d6478ca\n"
    },
    {
      "commit": "04906863a1fa7f296ac11f07e62aa688da39c3ad",
      "tree": "920f274f1058dafcdc3a0c6a4772eba868f09be4",
      "parents": [
        "af1a4dc989d6707116eaefab300ad55124aace66"
      ],
      "author": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Thu Oct 09 09:47:12 2014 -0700"
      },
      "committer": {
        "name": "Marco Nelissen",
        "email": "marcone@google.com",
        "time": "Thu Oct 09 09:47:12 2014 -0700"
      },
      "message": "Fix VideoFrame class layout for 64/32 bit\n\nThis structure is passed between 64 and 32 bit processes via shared\nmemory, so ensure it\u0027s the same size, and that the members we care\nabout are in the same place.\n\nBug: 17569156\nChange-Id: Id776bc825af1fbf43a6dd3407cca064f6d932902\n"
    },
    {
      "commit": "83b8808faad1e91690c64d7007348be8d9ebde73",
      "tree": "b541b1172f804e04bd19b29f7878a1becf6205d7",
      "parents": [
        "c15c265676da2226a18a5373812608b19d4719d7"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Fri Jun 20 18:31:16 2014 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 24 02:56:47 2014 +0000"
      },
      "message": "audio flinger: add patch connection between hw modules\n\nAdd support for audio device connections between different audio\nhw modules.\nThe patch is performed by creating a bridge between the playback\nthread connected to the sink device and the record thread connected\nto the source device using a pair of specialized PlaybackTrack and\nRecordTrack.\n- Added PatchTrack and PatchRecord classes.\n- Added TrackBase type to indicate more clearly the track behavior.\n- A TrackBase can allocate the buffer or reuse an existing one.\n- Factored some code in openOutput() and openInput() for internal use\nby PatchPanel.\n\nBug: 14815883.\n\nChange-Id: Ib9515fcda864610458a4bc81fa8f59096ff4d7db\n"
    },
    {
      "commit": "7903bb2b3065d58cc75637900922b434f50024d9",
      "tree": "33e825d96a3c1ca8a7778d50068e738d0cfa7272",
      "parents": [
        "14c403fbab456a4a63586a767fbae498f5f8c260",
        "2a8270e6944fb3addfcba87f6885aaad196b8b88"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Thu Jun 12 00:15:39 2014 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu Jun 12 00:15:39 2014 +0000"
      },
      "message": "am 2a8270e6: am c323737d: Merge \"Offer a type-safe album art interface.\"\n\n* commit \u00272a8270e6944fb3addfcba87f6885aaad196b8b88\u0027:\n  Offer a type-safe album art interface.\n"
    },
    {
      "commit": "f3e80dddd7376aa9deeb27de25e1d50030a2ad98",
      "tree": "a3ebf2e96fa0bb9b0375281692adf48333bca468",
      "parents": [
        "d3af4265dca4c8ebcead5376f1c73a5dafc34778"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Tue Jun 10 16:55:38 2014 -0700"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Jun 11 14:45:27 2014 -0700"
      },
      "message": "Offer a type-safe album art interface.\n\nBug: 15514223\nChange-Id: Iddfc33a00e6cd3779ca09c01a55f62b151f6ec95\n"
    },
    {
      "commit": "c56f3426099a3cf2d07ccff8886050c7fbce140f",
      "tree": "9e486a809f9d500a70fd26c4e1d2596ded190dbe",
      "parents": [
        "7c96d53a65085f42ac2b6d416cbc16fd36ed72ff"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Mar 21 17:53:17 2014 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon May 19 09:46:25 2014 -0700"
      },
      "message": "Pass stereo gains as packed minifloat\n\nThis will allow (eventually) a greater dynamic range for gains.\nHowever there are still a few remaining places in effects and mixer\nthat will also need to be changed in order to get the full benefit.\n\nAlso fixes a minor bug: was not checking for NaN in AudioTrack C++.\n\nChange-Id: I63bce9e82e0a61546d8ff475fb94bcb700d99c96\n"
    },
    {
      "commit": "751a9c8cbc391a91604dd1052fb95d3e4d278c2f",
      "tree": "2148da61941d0a19ba1b2118158dfb7d98d6a010",
      "parents": [
        "7eacea1156a3896ee7813cd9a06c535e63c95f6a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 28 11:03:28 2014 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@android.com",
        "time": "Thu Feb 13 07:57:20 2014 -0800"
      },
      "message": "Replace size_t in shared memory by uint32_t\n\nEventually we may want to use uint64_t, but will need to confirm atomicity.\n\nBug: 12381724\nChange-Id: Ia2c591d262d22b47b6f7dab4b9d9faa14b86d865\n"
    },
    {
      "commit": "fdac7c00f9201bb3a9862069145f01d37e39755b",
      "tree": "f82c52ff982030d0b1c4d7ea75a987300393c7b3",
      "parents": [
        "9be49c915852b592a881be3905658e4fc698749d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 28 11:03:28 2014 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 28 20:06:35 2014 +0000"
      },
      "message": "Replace size_t in shared memory by uint32_t\n\nEventually we may want to use uint64_t, but will need to confirm atomicity.\n\nBug: 12381724\nChange-Id: Ia2c591d262d22b47b6f7dab4b9d9faa14b86d865\n"
    },
    {
      "commit": "74935e44734c1ec235c2b6677db3e0dbefa5ddb8",
      "tree": "dc7bc2c9f496097e95ff36440fcd79886517ba53",
      "parents": [
        "bd72d22097f78f5bd668b223bc8c94e351311e31"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Dec 19 08:56:45 2013 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Dec 20 08:40:55 2013 -0800"
      },
      "message": "Replace control block frameCount_ by explicit in/out parameter\n\nin IAudioFlinger::createTrack and IAudioFlinger::openRecord\n\nChange-Id: I09c644c80e92c8e744b1b99055988a2588b2a83d\n"
    },
    {
      "commit": "a153b68f2260a8ed7fbb236fa659b13264ac5ac0",
      "tree": "fde0bd5a83da59bde7dc9b146a8a8af48d911adc",
      "parents": [
        "6a7327f110b86613e6e8c7de105c49803acacc1d",
        "77177fa20773d02b4f9c4147ecb98107f019fa7d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Oct 18 15:09:03 2013 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Fri Oct 18 15:09:03 2013 -0700"
      },
      "message": "am 77177fa2: am 95c03858: Merge \"Allow releaseBuffer after flush\" into klp-dev\n\n* commit \u002777177fa20773d02b4f9c4147ecb98107f019fa7d\u0027:\n  Allow releaseBuffer after flush\n"
    },
    {
      "commit": "2e422c472c91aa7912befd0fc038d1e11f354bc1",
      "tree": "7583e04f353f9cadf5081fafdcb8042450e3c85c",
      "parents": [
        "dedc7b0fa23c21b525dc8abb572bb8161ad66a9b"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Oct 18 13:00:29 2013 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Oct 18 13:53:41 2013 -0700"
      },
      "message": "Allow releaseBuffer after flush\n\nAfter AudioTrack start checks for pending flush,\nallow releaseBuffer on any previously obtained buffer.\nFor example, this can happen if the resampler has obtained\na buffer but not released the whole buffer yet.\nNote that the resampler will be reading obsolete data.\n\nBug: 11285590\nChange-Id: I0614fbb62e43604aac3089cce4b7797c87a306b5\n"
    },
    {
      "commit": "771f1b6d196b7924707fc44177ac3a88fc31fa9e",
      "tree": "ffd599ada0a44511112fe0586c8f56121ce9ce6e",
      "parents": [
        "a529ee78d7cc5d94cbe79cea2d7e6469c88a0fba",
        "7f8c397378a7ee5abd395413be71388ad36d3ed2"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Oct 16 15:38:30 2013 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Wed Oct 16 15:38:30 2013 -0700"
      },
      "message": "am 7f8c3973: am 120a8847: Merge \"AudioTrack: fix head position after restore\" into klp-dev\n\n* commit \u00277f8c397378a7ee5abd395413be71388ad36d3ed2\u0027:\n  AudioTrack: fix head position after restore\n"
    },
    {
      "commit": "cc21e4f1e41dfa17e7e2bef995fcd22c45f6bcd0",
      "tree": "a446f08a1adaf31ef5dddc491c620209176b67aa",
      "parents": [
        "014e7fa2e90827d911c37bb0ce4d2e10e14d0bb3"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Oct 16 15:12:32 2013 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Wed Oct 16 15:12:32 2013 -0700"
      },
      "message": "AudioTrack: fix head position after restore\n\nThe head position transfered to the new track\nby restoreTrack_l() must take into account the frames that\nare dropped from the old track to avoid a non recoverable\noffset in the playback head position returned to applications.\n\nBug: 11230062.\nChange-Id: I51143a08b95e8f264ed709ae2054360315f2b8b1\n"
    },
    {
      "commit": "16f3201d2fe99a39a8a9bb478528ae9003645dfe",
      "tree": "44cfe4ab9e4004df968b8334e3928c00e78f412a",
      "parents": [
        "44173e2805eba1c5812dd39c02e3964ebdd2104e",
        "11454092e4a94d3c8b4576c981595339abdfac0d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Sep 17 15:07:10 2013 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Tue Sep 17 15:07:10 2013 -0700"
      },
      "message": "am 11454092: am 18f86140: Merge \"Fix underruns when fast track denied due to SRC\" into klp-dev\n\n* commit \u002711454092e4a94d3c8b4576c981595339abdfac0d\u0027:\n  Fix underruns when fast track denied due to SRC\n"
    },
    {
      "commit": "ce8828a016b082f730152af2204b8ea3610dc1ec",
      "tree": "aad0c32a17516519b22bcea0d4f2fa7c81c61d28",
      "parents": [
        "d176ec1e371a686c58385692a28da677e398c302"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Sep 16 18:07:38 2013 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Sep 17 11:24:02 2013 -0700"
      },
      "message": "Fix underruns when fast track denied due to SRC\n\nOpenSL ES requests a fast track.  If sample rate conversion is needed,\nthe request is denied by server, and a larger client buffer is used\nto handle the higher latency of a normal track.  However the client\nnotification period was calculated based on buffer being divided into\n2 sub-buffers.  That resulted in the notification period being too long.\nThe server pulls chunks that are smaller than half the total buffer.\nSo now the client uses 3 sub-buffers when there is SRC.\n\nAlso removed the \u0027defer wake\u0027 optimization because it was incorrect.\nThis optimization attempted to reduce the number of wakeups of client,\nwhen server releaseBuffer knows that another releaseBuffer will be\nfollowing.  But there is no way for the first releaseBuffer to predict\nhow soon the second releaseBuffer will occur.  In some cases it was\na long time, and the client underran.  So now the client is woken up\nimmediately if the total number of available frames to client is \u003e\u003d\nthe minimum number the client wants to see (the notification period).\n\nAlso fix bug where minimum frame count was not being used in the\ncalculation of notification period.\n\nBug: 10342804\nChange-Id: I3c246f4e7bc3684a344f2cf08268dc082e338e2a\n"
    },
    {
      "commit": "f557872b594d15599bdb65efd91eb5adeb1d0840",
      "tree": "8df16a0c49bac71163035d11562e06bcc12a2490",
      "parents": [
        "30c296c153447f5c2bb5251928bf4d3c4e28e552",
        "908d3c09ca7f2ccb280aa5dc8d876099ff9a9d0f"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Aug 29 17:12:45 2013 -0700"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Thu Aug 29 17:12:45 2013 -0700"
      },
      "message": "am 908d3c09: am 51ec03c2: Merge \"Implement Track::getTimestamp()\" into klp-dev\n\n* commit \u0027908d3c09ca7f2ccb280aa5dc8d876099ff9a9d0f\u0027:\n  Implement Track::getTimestamp()\n"
    },
    {
      "commit": "bd096fd9d8e5fc0e62f98807f4818a06f70d0812",
      "tree": "8ff27bce9f34e4bdd0f8e233494a24efef475a7d",
      "parents": [
        "573d80a8f463f648a515fc0975bf83951b272993"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Aug 23 13:53:56 2013 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Aug 29 09:59:31 2013 -0700"
      },
      "message": "Implement Track::getTimestamp()\n\nusing a new timestamp latch in PlaybackThread, and\nAudioTrackServerProxy::framesReleased() which returns mServer.\n\nChange-Id: I1ebfba968c773faaab95648c272fd3ebd74718d6\n"
    },
    {
      "commit": "e198c360d5e75a9b2097844c495c10902e7e8500",
      "tree": "be6884fcddb31fb8feda454e38b00053ccac7bf1",
      "parents": [
        "2fc14730e4697a6f456b4631549c9981f6b0b115"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Aug 13 09:13:36 2013 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Aug 13 09:55:52 2013 -0700"
      },
      "message": "Whitespace\n\nChange-Id: Id3ccc183a03421330d0498faaa62a45915cdc3d6\n"
    },
    {
      "commit": "82aaf94a5b18939e4d790bbc752031f3070704a3",
      "tree": "4e39e32d0ccde726548afcbd81e253d5e316b295",
      "parents": [
        "b08ab81bab9e8cd2e3a7fff02725a387070fd078"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jul 17 16:05:07 2013 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jul 31 09:15:00 2013 -0700"
      },
      "message": "Report underruns for fast tracks also\n\nThis fixes a regression that was introduced earlier\nby commit 9f80dd223d83d9bb9077fb6baee056cee4eaf7e5\ncalled \"New control block for AudioTrack and AudioRecord\".\nThat commit broke underrun reporting for fast tracks.\n\nAlso remove Track::mUnderrunCount, which counted the number of underrun\nevents, and was only used by dumpsys media.audio_flinger.\n\nNow dumpsys media.audio_flinger reports the number of underrun frames,\n\nIsolated underrun-related control block accesses via the proxy, so that\nthe server is not directly poking around in the control block.\n\nThe new proxy APIs are AudioTrackServerProxy::getUnderrunFrames() and\nAudioTrackServerProxy::tallyUnderrunFrames().  getUnderrunFrames() returns\na rolling counter for streaming tracks, or zero for static buffer tracks\nwhich never underrun, but do a kind of \u0027pause\u0027 at end of buffer.\ntallyUnderrunFrames() increments the counter by a specified number of frames.\n\nChange-Id: Ib31fd73eb17cbb23888ce3af8ff29f471f5bd5a2\n"
    },
    {
      "commit": "d054c32443a493513ab63529b0c8b1aca290278c",
      "tree": "fc68ba259ded1dd4960bee2938a9bcc7c599c9a3",
      "parents": [
        "96f60d8f04432a1ed503b3e24d5736d28c63c9a2"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jul 12 12:59:20 2013 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jul 30 09:50:48 2013 -0700"
      },
      "message": "Move control block mName to createTrack() output\n\nThis is part of a series of CLs to clean up the shared memory\ncontrol block, by removing any fields that don\u0027t have to be there.\n\nChange-Id: I6e51003a1293b6800258c31b22cff2eba42162e7\n"
    },
    {
      "commit": "96f60d8f04432a1ed503b3e24d5736d28c63c9a2",
      "tree": "083f6224327e0965a925076b3e1aec5636598203",
      "parents": [
        "97252bb0e40a5a9b41f020163393cf6c5da10b7e"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jul 12 10:21:18 2013 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jul 30 09:40:17 2013 -0700"
      },
      "message": "Rename control block flags to mFlags\n\nChange-Id: I7b6d31e24531954ab1ecdf3ed56c19433700bd89\n"
    },
    {
      "commit": "f20e1d8df84c5fbeeace0052d100982ae39bb7a4",
      "tree": "997cd41de1adb829c194f56cf29eb02945666b94",
      "parents": [
        "eced2daaa6c91a3731eef978ce65c6ec319c5e6a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jul 12 09:45:18 2013 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jul 30 09:24:03 2013 -0700"
      },
      "message": "Rename control block server to mServer and add comments\n\nChange-Id: Ieabd91acee92d0e84e66fbd358df5282b856306e\n"
    },
    {
      "commit": "b1a270d1e926fb9a01b4265a7675ed0c2c8f4868",
      "tree": "091d06b02bc126ff1bb2dd1fabc9be829582ae69",
      "parents": [
        "bfb1b832079bbb9426f72f3863199a54aefd02da"
      ],
      "author": {
        "name": "Richard Fitzgerald",
        "email": "rf@opensource.wolfsonmicro.com",
        "time": "Tue May 14 12:12:21 2013 +0100"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 25 14:08:09 2013 -0700"
      },
      "message": "libmedia: offloaded playback support\n\n- start() returns a status so that upper layers can\nrecreate a non offloaded track in case of error.\n\n- Added states to handle offloaded tracks specific:\n  - waiting for stream end (drain) notification by\naudio flinger\n  - allow pause while waiting for stream end notification\n\n- getPosition() queries the render position directly from\naudio HAL.\n\n- disable APIs not applicable to offloaded tracks\n\n- Modified track restoring behavior for invalidated\noffloaded tracks: just send the callback and wait for\nupper layers to create a new track.\n\n- Added wait for stream end management in audio track client\nproxy. Similar to obtainBuffer and should be factored in.\n\nChange-Id: I0fc48117946364cb255afd653195498891f622bd\nSigned-off-by: Eric Laurent \u003celaurent@google.com\u003e\n"
    },
    {
      "commit": "bfb1b832079bbb9426f72f3863199a54aefd02da",
      "tree": "5007d22456776dc77d124be84bcfe8bc4152bbb2",
      "parents": [
        "fc5ea08326b510c6f82f71845d95a8758a6ab698"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Jan 07 09:53:42 2013 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jul 25 14:08:09 2013 -0700"
      },
      "message": "AudioFlinger: offload playback, non-blocking write\n\n- Added specialized playback thread class for offload playback,\nderived from directoutput thread.\nThis thread type handles specific state transitions for offloaded\ntracks and offloading commands (pause/resume/drain/flush..) to audio HAL.\nAs opposed to other threads, does not go to standby if the track is paused.\n\n- Added support for asynchronous write and drain operations at audio HAL.\nUse a thread to handle async callback events from HAL: this avoids locking\nplayback thread mutex when executing the callback and cause deadlocks when\ncalling audio HAL functions with the playback thread mutex locked.\n\n- Better accouting for track activity: call start/stop and release Output\nmethods in audio policy manager when tracks are actually added and removed\nfrom the active tracks list.\nAdded a command thread in audio policy service to handle stop/release commands\nasynchronously and avoid deadlocks with playback thread.\n\n- Track terminated status is not a state anymore. This condition is othogonal\nto state to permitted state transitions while terminated.\n\nChange-Id: Id157f4b3277620568d8eace7535d9186602564de\n"
    },
    {
      "commit": "7db7df0e8d9d7cee8ba374468cdbfa0108e3337c",
      "tree": "d1f5c23d596c07854e75999dbf333194d500aaa5",
      "parents": [
        "8f13428cb29a9b610a9e9a0f5fea437cd2d3f032"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jun 25 16:13:23 2013 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jul 02 14:45:19 2013 -0700"
      },
      "message": "AudioTrackShared cleanup\n\nMaintain unreleased frame count on client side also (was already there on server side).\nAssertion failure instead of BAD_VALUE status for incorrect usage of APIs.\nClean up error handling code.\n\nChange-Id: I23ca2f6f8a7c18645309ee5d64fbc844429bcba8\n"
    },
    {
      "commit": "ad3af3305f024bcbbd55c894a4995e449498e1ba",
      "tree": "2e242d4c49cce9faefc28665c6ee63a2a5da170c",
      "parents": [
        "7919fa2c33b1fa7f5e49b2188d671bfe519c231e"
      ],
      "author": {
        "name": "Richard Fitzgerald",
        "email": "rf@opensource.wolfsonmicro.com",
        "time": "Mon Mar 25 16:54:37 2013 +0000"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jun 27 17:16:24 2013 -0700"
      },
      "message": "Public API changes for audio offload support.\n\nNOTE: this does _not_ include all private member variables added\nto classes as part of offload support. Only public/protected functions\nand stubs functions/variables needed to make the changes buildable.\n\n- isOffloadSupported() added to audio policy service\n    A stub implementation is required to build, this always returns false\n- setParameters() added to IAudioTrack\n    A stub implementation is required to build, this always returns\n    INVALID_OPERATION\n\n- CBlk flag for stream end\n\n- Change AudioSystem::getRenderPosition() to take an audio_output_t\n    so caller can specify which output to query\n\n- Add AudioSystem::isOffloadSupported()\n    This is fully implemented down to the AudioFlinger function\n    AudioPolicyServer::isOffloadSupported() which is just a stub\n    that always returns false.\n\n- Add EVENT_STREAM_END to AudioTrack interface.\n    STREAM_END is used to signal when the hardware has actually finished\n    playing all the data it was sent.\n\n- Add event type enumeration to media player interface AudioSink callbacks\n    so that the same callback can be used to handle multiple types of\n    event. For offloaded tracks we also have to handle STREAM_END and\n    TEAR_DOWN events\n\n- Pass audio_offload_info_t to various functions used for opening outputs,\n    tracks and audio players. This passes additional information about the\n    compressed stream down to the HAL when using offload.\n    For publicly-available APIs this is an optional parameter (for some of\n    the internal and low-level APIs around the HAL interface it is mandatory)\n\n- Add getParameters() and setParameters() API to AudioTrack\n    Currently dummy implementations.\n\n- Change AudioPlayer contructor so that it takes a set of bitflags defining what\n    options are required. This replaces the original bool which only specified\n    whether to use deep buffering.\n\n- Changes to StageFright class definition related to handling tearing-down of\n    an offloaded track when we need to switch back to software decode\n\n- Define new StageFright utility functions used for offloaded tracks\n    Currently dummy implementations.\n\n- AudioFlinger changes to use extended audio_config_t.\n    Fills in audio_offload_info_t member if this info is passed in when\n    opening an output.\n\n- libvideoeditor changes required to add the new event type parameter\n    to AudioSink callback functions\n\n- libmediaplayerservice changes required to add the new event type parameter\n    to AudioSink callback functions\n\nChange-Id: I3ab41138aa1083d81fe83b886a9b1021ec7320f1\nSigned-off-by: Richard Fitzgerald \u003crf@opensource.wolfsonmicro.com\u003e\nSigned-off-by: Eric Laurent \u003celaurent@google.com\u003e\n"
    },
    {
      "commit": "0d09a9bec07b3bec78bd473ff0bfcf0a261f3f25",
      "tree": "410d8c22e5d15f9143d04212cd96939c217cacc5",
      "parents": [
        "a2cf13c77260f98fc674f103dcbd2bb2488a80ce"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jun 24 12:06:46 2013 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Jun 24 13:34:08 2013 -0700"
      },
      "message": "Use mFutex as an event flag rather than semaphore\n\nAn event flag can be more fault-tolerant in case of loss of synchronization,\nas it cannot overflow.  It also allows more bits to be used in the future.\nSee http://en.wikipedia.org/wiki/Event_flag\n\nChange-Id: I01ca25d951eb263124da54bb4738f0d94ec4a48b\n"
    },
    {
      "commit": "9f80dd223d83d9bb9077fb6baee056cee4eaf7e5",
      "tree": "79f19f80ebb7978e9bab16e1d9b835849c735592",
      "parents": [
        "9fef8d453b15a91a2b748faac2bfaff713bcf1e1"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Dec 18 15:57:32 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jun 12 14:33:10 2013 -0700"
      },
      "message": "New control block for AudioTrack and AudioRecord\n\nMain differences between old and new control block:\n - removes the mutex, which was a potential source of priority inversion\n - circular indices into shared buffer, which is now always a power-of-2 size\n\nChange-Id: I4e9b7fa99858b488ac98a441fa70e31dbba1b865\n"
    },
    {
      "commit": "5c4cc0d99d3b1cb35c5d7c237272ee53142745fb",
      "tree": "96c55aba5ce8363f33a05641f0a4be8ed09128c9",
      "parents": [
        "d573622dc001c23223cb26b1f55fb75be189e77d"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Nov 26 10:40:24 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Mar 05 08:26:50 2013 -0800"
      },
      "message": "Add template class SingleStateQueue\n\nChange-Id: If7e2bc9b2a216524ee9cbb68682e2634933b4973\n"
    },
    {
      "commit": "e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39",
      "tree": "90fdb6e9da1a03f4f24691aae27ae94ff913f1c7",
      "parents": [
        "84b6440fa1d1274267deabe0bd8dc626b5548e4c"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Dec 04 12:22:46 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Dec 12 12:21:59 2012 -0800"
      },
      "message": "Start isolating control block accesses in a proxy\n\nThe proxy object will eventually be the only code that understands the\ndetails of the control block.  This should make it easier to change the\ncontrol block in the future.\n\nInitial set of control block fields that are isolated:\n - sample rate\n - send level\n - volume\n\nPrepare for streaming/static separation by adding a union to the control\nblock for the new fields.\n\nFix bug in handling of max sample rate on a track.  It was only checking\nat re-configuration, not at each mix.\n\nSimplify OutputTrack::obtainBuffer.\n\nChange-Id: I2249f9d04f73a911a922ad1d7f6197292c74cd92\n"
    },
    {
      "commit": "24ee6aaf1368e3a07061948273c629d05cb9b12a",
      "tree": "c915ddc3f5b594050258178b31075ff073b1b570",
      "parents": [
        "45f7c446777171a728f9eb257f48145dde5d19e2",
        "ba6b1bc38e0c355277f69af286469adb5f02e876"
      ],
      "author": {
        "name": "Andreas Huber",
        "email": "andih@google.com",
        "time": "Fri Nov 30 08:51:51 2012 -0800"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Fri Nov 30 08:51:51 2012 -0800"
      },
      "message": "am ba6b1bc3: am e7550eb2: Merge \"Initialize and copy mRotationAngle in VideoFrame\"\n\n* commit \u0027ba6b1bc38e0c355277f69af286469adb5f02e876\u0027:\n  Initialize and copy mRotationAngle in VideoFrame\n"
    },
    {
      "commit": "37007147edde731cd3dc74febd7bb7e093a35020",
      "tree": "3e85f5a609e879554d48945b502c951f75f44724",
      "parents": [
        "5768fa034ede834656697d3612c525595ff85ef9"
      ],
      "author": {
        "name": "Christer Fletcher",
        "email": "christer.fletcher@sonyericsson.com",
        "time": "Thu Sep 13 10:28:39 2012 +0200"
      },
      "committer": {
        "name": "Johan Redestig",
        "email": "johan.redestig@sonymobile.com",
        "time": "Fri Nov 30 15:32:18 2012 +0100"
      },
      "message": "Initialize and copy mRotationAngle in VideoFrame\n\nWhen thumbnails were generated they could be generated at random\nangles as the mRotationAngle variable was not initialized to any\nvalue. This variable would have to be explicitly overwritten to not\ncause random rotation. Changed the implementation to initialize the\nvalue to 0 (no rotation). mRotationAngle was also missing in the\ncopy constructor.\n\nChange-Id: I67a5340fdd807c6ab3a3da5eecb09b5b9d5f4666\n"
    },
    {
      "commit": "b603744e96b07b1d5bf745bde593fb2c025cefcf",
      "tree": "0c8ae15dbd430ccfcb872c701de48907ec48afc8",
      "parents": [
        "f91a3abb7d136e75f0f5d999193b8c8297d97628"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Nov 14 13:42:25 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Nov 16 15:01:47 2012 -0800"
      },
      "message": "Don\u0027t use control block frame count after create\n\nThis is part of a series to clean up the control block.\n\nChange-Id: I7f4cb05aef63053f8e2ab05b286d302260ef4758\n"
    },
    {
      "commit": "22eb4e239fbe9103568147d566d7482e480350b8",
      "tree": "132fa6ac8c0bc47fd6d3b1cc67d1724dc3b939a2",
      "parents": [
        "2d81f665461409f0c5d0be674a35a0aea63a4fc8"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Nov 07 14:03:00 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Nov 14 11:58:17 2012 -0800"
      },
      "message": "Update audio comments\n\nChange-Id: I85d7d2f6381b251db5695202fec75128883a8662\n"
    },
    {
      "commit": "b36a7a68af073b1e7fd5cad6aa2c52223fd30efd",
      "tree": "ffab4964484a5eac7e9ca8f50a40c03cf4cd4e82",
      "parents": [
        "93a7efd45c28becb994f0818ea29c00ec45eea57"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Nov 12 15:46:10 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Nov 13 08:51:39 2012 -0800"
      },
      "message": "Simplify AudioRecord::restoreTrack_l()\n\nFinish removing CBLK_RESTORING and CBLK_RESTORED from control block flags,\nand remove constant RESTORE_TIMEOUT_MS.\n\nAlso minor cleanup:\n - Cache mCblk in local variable cblk and make cblk allocatable in a register.\n - Use \"iMem\" for sp\u003cIMemory\u003e.\n - Add missing error log to AudioRecord; it was already in AudioTrack.\n\nThis is part of a series to clean up the control block.\n\nChange-Id: Ia5f5ab4763c392bc06a45851b167ddaee29e3455\n"
    },
    {
      "commit": "83a0382dc17364567667a4e6135db43f5bd92efc",
      "tree": "c3738c183fa49d9ccd023e27b37024860ccfff22",
      "parents": [
        "bc0f6b92bba33ca9c2e76f2a520d290f055da6b2"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Nov 12 07:58:20 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Nov 12 15:13:34 2012 -0800"
      },
      "message": "Move frame size out of the control block\n\nThis is part of a series to clean up the control block.\n\nChange-Id: Ifab1c42ac0f8be704e571b292713cd2250d12a3f\n"
    },
    {
      "commit": "b929e417853694e37aba1ef4399f188987b709d9",
      "tree": "670f2da01fd3d33df6da2998c78273e0701300ad",
      "parents": [
        "a47f3165f53c8e8fb8907a94de7417e2c3047eeb"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Nov 08 12:13:58 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Nov 08 12:18:59 2012 -0800"
      },
      "message": "Move buffers pointer out of the control block\n\nThis is part of a series to clean up the control block.\n\nChange-Id: Ie474557db7cb360f2d9a0f11600a68f5a3d46f07\n"
    },
    {
      "commit": "a47f3165f53c8e8fb8907a94de7417e2c3047eeb",
      "tree": "d6f691af946f8754b8534347c9b0b3ec535e776e",
      "parents": [
        "659004c2949620d8adb29e1d950a2dd1c75ba9a9"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Nov 07 10:13:08 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Nov 08 11:22:38 2012 -0800"
      },
      "message": "Simplify AudioTrack::restoreTrack_l()\n\nRemove CBLK_RESTORING and CBLK_RESTORED from control block flags,\nfor AudioTrack only.  They are still used by AudioRecord.\n\nThis is part of a series to clean up the control block.\n\nChange-Id: Iae4798f5b527c492bdaf789987ff3a1dadd0cb37\n"
    },
    {
      "commit": "864585df53eb97c31e77b3ad7c0d89e4f9b42588",
      "tree": "529492712326aa5aa997aa2d2f66a65baf4356b1",
      "parents": [
        "8fa3ad0e4c77f7868348ad2a4cacc34c34e7c39e"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Nov 06 16:15:41 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Nov 07 08:32:40 2012 -0800"
      },
      "message": "Remove CBLK_DIRECTION from control block flags\n\nThis is part of a series to clean up the control block.\n\nChange-Id: I0265fece3247356b585d4d48fbda6f37aea8a851\n"
    },
    {
      "commit": "e0b07179a48ee50fda931d2aa1b3c751d167e4d7",
      "tree": "d495cc851dba53652011108297d100e64a4c4acd",
      "parents": [
        "48c6b2628f8a6037309c7957b07129d850187aa3"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Nov 06 15:03:34 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Nov 06 17:25:22 2012 -0800"
      },
      "message": "Remove CBLK_FAST from control block flags\n\nThis is part of a series to clean up the control block.\n\nChange-Id: Ic881a3560d9547cb63fcc0cefec87aa3da480e0d\n"
    },
    {
      "commit": "9c5fdd83f9b9f49be35107971feb33528d60b945",
      "tree": "cd8f20f3c4355d55057cc70369be9c2d3f890838",
      "parents": [
        "ad4e408b8ea397caadbfee85e1e39515e7e08104"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Nov 05 13:38:15 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Mon Nov 05 13:43:51 2012 -0800"
      },
      "message": "Simplify control block flag names\n\nUse only one symbol per flag\n\nChange-Id: Ia3582e2134abd60c896d11337face65383e79c7c\n"
    },
    {
      "commit": "85ab62c4b433df3f1a9826bed1c9bec07a86c750",
      "tree": "0c5443a20824924cb7403f4cabfee84062489793",
      "parents": [
        "5fe6138bd839297a1eed16885102b3bdfc98c040"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Nov 01 11:11:38 2012 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu Nov 01 12:19:25 2012 -0700"
      },
      "message": "Line length 100\n\nChange-Id: Ib28fd7b9ce951a6933f006e7f8812ba617625530\n"
    },
    {
      "commit": "0c9d26d187017f7fb028ab52a0fbc6395142faa4",
      "tree": "35fd2f6babef082b85058fd27a69bda048687295",
      "parents": [
        "b4ea1ab821d652cb080910d4081f5f1318597a90"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Thu May 31 14:35:01 2012 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jun 13 15:12:42 2012 -0700"
      },
      "message": "Log track name on obtain/releaseBuffer warnings\n\nThis should help diagnose problems by allowing us to correlate\nthe logs with the dumpsys media.audio_flinger output.\n\nChange-Id: I8c7c592b4f87d13b0f29c66ce7a2f301a0f063c9\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": "559bf2836f5da25b75bfb229fec0d20d540ee426",
      "tree": "d7dd708b17eeca96a3e5d8bcc25a51ff3d1b5d0d",
      "parents": [
        "b0b2b4d890cf3bfb274797a759642b4e733343d7"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Wed Mar 28 10:29:14 2012 -0700"
      },
      "committer": {
        "name": "Anatol Pomozov",
        "email": "anatol.pomozov@gmail.com",
        "time": "Wed Mar 28 12:07:41 2012 -0700"
      },
      "message": "AV Android make files changes\n\no plus a few file relocation: ActivityManager.cpp/h, SoundPool.h, etc\no remove some runtime dependencies to libandroid, libandroid_runtime, etc\n\nChange-Id: I047a47c5fb361dd5cf85cd98798c39f629a75d10\n"
    },
    {
      "commit": "00a10e8eb39526df06779e0cdb6e6871752934d7",
      "tree": "0436b46c52a7118707958a170ff601abdadaa998",
      "parents": [
        "ef36d496477d1e2ae99c3cd43eee5cf7e82b0883"
      ],
      "author": {
        "name": "Romain Guy",
        "email": "romainguy@google.com",
        "time": "Mon Mar 26 16:45:05 2012 -0700"
      },
      "committer": {
        "name": "Romain Guy",
        "email": "romainguy@google.com",
        "time": "Mon Mar 26 16:45:05 2012 -0700"
      },
      "message": "Use a status_t return type for GL functors\n\nWebView needs more fine-grained control over the behavior of the\nframework upon execution of the display lists. The new status_t\nallows WebView to requests its functor to be re-executed directly\nwithout causing a redraw of the entire hierarchy.\n\nChange-Id: I97a8141dc5c6eeb6805b6024cc1e76fce07d24cc\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": "9f08fa0c5bd9353720feeb989a3af4610c929ca6",
      "tree": "d02b247e60027e5804e05565be83000923f5510a",
      "parents": [
        "b279312a9038b9c5b9b05b31b1b1db86f748efd8"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Wed Mar 07 19:36:08 2012 -0800"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Wed Mar 07 19:36:08 2012 -0800"
      },
      "message": "remove files that moved to frameworks/native\n\nChange-Id: I140d291e520097b1148930f736823650e08488f7\n"
    },
    {
      "commit": "df712ea86e6350f7005a02ab0e1c60c28a343ed0",
      "tree": "75401d5ef563d1ae76aaae4965f65bb39f92736c",
      "parents": [
        "d3393c35259588e8ad61a43d1d1aa1568e943307"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Sat Feb 25 18:48:35 2012 -0800"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon Feb 27 13:03:08 2012 -0800"
      },
      "message": "fix libgui header location\n\nChange-Id: Iec71706cdd4f29c6904993648ce873e83ef9cafe\n"
    },
    {
      "commit": "d3393c35259588e8ad61a43d1d1aa1568e943307",
      "tree": "7233201662164b0b3c6abe1e05cbfb079bf8756d",
      "parents": [
        "e628d515888baadba75442128678e747e930ed58"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Sat Feb 25 19:52:53 2012 -0800"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon Feb 27 13:03:04 2012 -0800"
      },
      "message": "libagl shouldn\u0027t export anything\n\nChange-Id: Ia823dbc56aab2a0b8a6063df4348fe6baac124c6\n"
    },
    {
      "commit": "9eeafeb52fecf90882e9b44eeefcb7c3e16aa915",
      "tree": "0a09b02937d7097e042367163fbe4c9d4b5b2230",
      "parents": [
        "5ce96d97feafc6989f6141bb2633eae3d87ddf28"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri Feb 24 18:25:41 2012 -0800"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri Feb 24 18:26:01 2012 -0800"
      },
      "message": "remove dependency on android_native{s_priv|buffer}.h\n\nChange-Id: Ie4b95f7061c240f37c504414259f92d72c4ffc89\n"
    },
    {
      "commit": "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": "1a0ae5be3d1273cba12584b33830d859510fbf82",
      "tree": "8073be7b5e33ee230159f7c0aed22bb6de63d3f9",
      "parents": [
        "787bae0578fbaab6219ebf23494866b224d01438"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 10:24:48 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Feb 03 16:16:46 2012 -0800"
      },
      "message": "Don\u0027t double destruct audio_track_cblk_t\n\nFortunately audio_track_cblk_t doesn\u0027t have a destructor, but for clarity\nremove the double destruction.\n\nAlso add warning not to add any virtuals to audio_track_cblk_t.\n\nChange-Id: I70ebe1a70460c7002145b2cdf10f9f137396e6f3\n"
    },
    {
      "commit": "83d86538c4c479a9225c75ab27938e8f05abb9c8",
      "tree": "72fdff9fb9bb7e41fe48c41bfed65ab83b64f85f",
      "parents": [
        "58f30210ea540b6ce5aa6a46330cd3499483cb97"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 17 14:39:34 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 20 16:19:59 2012 -0800"
      },
      "message": "Make AudioTrack control block volume field private\n\nThis is part of the process of abstracting the control block\nto make it easier to maintain.\n\nChange-Id: Idb8f461e68dab3bcf268159cc0781651c6fb7094\n"
    },
    {
      "commit": "b1cf75c4935001f61057989ee3cf27bbf09ecd9c",
      "tree": "e3daaea6160475e36dedfccaabf5d8b94406d05e",
      "parents": [
        "f237a30e9344d43f832ba11db6f62c6ad2084444"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 17 12:20:54 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 17 16:25:17 2012 -0800"
      },
      "message": "Track volume cleanup\n\nAlways read and write track volumes atomically. In most places this was\nalready being done, but there were a couple places where the left and\nright channels were read independently.\n\nChanged constant MAX_GAIN_INT to be a uint32_t instead of a float.\nIt is always used as a uint32_t in comparisons and assignments.\nUse MAX_GAIN_INT in more places.\n\nNow that volume is always accessed atomically, removed the union\nand alias for uint16_t volume[2], and kept only volumeLR.\n\nRemoved volatile as it\u0027s meaningless.\n\nIn AudioFlinger, clamp the track volumes read from shared memory\nbefore applying master and stream volume.\n\nChange-Id: If65e2b27e5bc3db5bf75540479843041b58433f0\n"
    },
    {
      "commit": "613882293184e575a44bff681a3decaefe889e69",
      "tree": "052f84c8fe6e7b201f03117f617c3ad77b8b0dd0",
      "parents": [
        "0107954f72153db747a3727dc1157e9236dfed90",
        "b9980659501d0428d65d8292f3c32da69d37fbd2"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 17 07:27:46 2012 -0800"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue Jan 17 07:27:46 2012 -0800"
      },
      "message": "Merge \"Use size_t for frame size\""
    },
    {
      "commit": "05632a5fa4b88ca474294887fc92a9fcdf0e2352",
      "tree": "28e36d2cce839d66870ea066a2b334dd9b63c833",
      "parents": [
        "09192653e836b21689f004bf8dee375356641181"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Tue Jan 03 14:22:33 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 13 15:25:14 2012 -0800"
      },
      "message": "AudioTrack and AudioFlinger send level cleanup\n\nAdd an API to control block for getting/setting send level.\nThis allow us to make the mSendLevel field private.\n\nDocument the lack of barriers.\n\nUse 0.0f to initialize floating-point values (for doc only).\n\nChange-Id: I59f83b00adeb89eeee227e7648625d9a835be7a4\n"
    },
    {
      "commit": "b9980659501d0428d65d8292f3c32da69d37fbd2",
      "tree": "8b703aca299f4f715a65d07cc37b753e9753a941",
      "parents": [
        "f4e76c538f81068bc2e125f3f9ef8b8dd40f2d2a"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jan 11 09:48:27 2012 -0800"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Fri Jan 13 14:58:44 2012 -0800"
      },
      "message": "Use size_t for frame size\n\nexcept in the control block, where we don\u0027t have room.\n\nIn AudioFlinger::ThreadBase::TrackBase::getBuffer,\nread the frame size from control block only once.\n\nChange-Id: Id6c4bccd4ed3e07d91df6bbea43bae45524f9f4e\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": "404a123bed7f180724ead17f10e037b3eb347701",
      "tree": "cb569f01c8dd2bca25b44259a25d3b3d11daa0a1",
      "parents": [
        "c9260c15c1e7e2743039c964b8769379a3fff332"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Thu Nov 17 17:48:35 2011 -0800"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon Nov 28 15:21:57 2011 -0800"
      },
      "message": "split ComposerService out of SurfaceComposerClient.h\n\nChange-Id: I1eb691f7ca263d5895d871ab675bb5826e0323c6\n"
    },
    {
      "commit": "8343f2c317b48f9b9827781b16a5c9fd31743826",
      "tree": "dcc878af2cf5c119c029b6f51b6c68fa431e3b85",
      "parents": [
        "63970b42f101c87db7cfd26d43b0d300260b1582"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue Aug 30 18:51:54 2011 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue Aug 30 18:51:54 2011 -0700"
      },
      "message": "fix Surface positions are not floats\n\nAdded Surface.setPosition(float, float) which allows to set a surface\u0027s\nposition in float.\n\nBug: 5239859\nChange-Id: I903aef4ad5b5999142202fb8ea30fe216d805711\n"
    },
    {
      "commit": "81eedd1746be590d5d506dfb9ff23619f9d9898f",
      "tree": "caeac020149ff784bea22015b30232543a35c791",
      "parents": [
        "9d35d0c4a1371d52c4ce4d34575967026d9135af"
      ],
      "author": {
        "name": "Mike Lockwood",
        "email": "lockwood@android.com",
        "time": "Wed Jul 13 11:06:57 2011 -0400"
      },
      "committer": {
        "name": "Mike Lockwood",
        "email": "lockwood@android.com",
        "time": "Wed Jul 13 19:45:44 2011 -0400"
      },
      "message": "Remove some #ifdef HAVE_ANDROID_OS that were needed for the simulator build\n\nChange-Id: I13d9f251f86c05ae5405f37adbf6b8e9660935ba\nSigned-off-by: Mike Lockwood \u003clockwood@android.com\u003e\n"
    },
    {
      "commit": "2df788fb0c402938f827bf9c9ce2ca3ab1dcd464",
      "tree": "9d0b50a3de930a214b706ffb5dd524a6dc9d4153",
      "parents": [
        "3e1763ecdf14769a534f75e94a56785f63174b47"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue Jun 28 19:09:31 2011 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Wed Jun 29 15:05:41 2011 -0700"
      },
      "message": "SF transactions are now O(1) wrt IPC instead of O(N).\n\nChange-Id: I57669852cbf6aabae244ea86940a08a5a27ffc43\n"
    },
    {
      "commit": "4b85d1750153085fe5d076b67802dfb1ea2bbb13",
      "tree": "207cba1b821ba6c22bfc11e7ae9096e74608f558",
      "parents": [
        "afcedc9e6f17d8213d9bd8f6c36643dcc816d0ef"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Wed Apr 20 14:20:59 2011 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon Jun 13 15:51:35 2011 -0700"
      },
      "message": "unify SurfaceTexture and Surface\n\nAdd the concept of synchronous dequeueBuffer in SurfaceTexture\nImplement {Surface|SurfaceTextureClient}::setSwapInterval()\nAdd SurfaceTexture logging\nfix onFrameAvailable\n"
    },
    {
      "commit": "c6854100cea4fcd0f20cb2ac8235c02d1849b3a1",
      "tree": "f99b0d979380e2208f3d07c56397205c06b38373",
      "parents": [
        "d217a8c4632b3e3065f8c2a26b9ce4dc4c97171f"
      ],
      "author": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jun 01 16:46:29 2011 -0700"
      },
      "committer": {
        "name": "Glenn Kasten",
        "email": "gkasten@google.com",
        "time": "Wed Jun 01 16:46:29 2011 -0700"
      },
      "message": "Remove unnecessary level of priority indirection\n\nChange-Id: I942d43973c20a7ace8b0d3f78b4da97e45e996c6\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": "68178d6419df65d606d9105b3324260d38d7b02c",
      "tree": "eaa78d765b0b77d2462a10c70f04cf6ac846217c",
      "parents": [
        "d0675ede6de2249256d20271a19ccbf9f11745b8"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon May 02 16:27:21 2011 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon May 02 16:27:21 2011 -0700"
      },
      "message": "remove last traces of copybit\n\nChange-Id: Ia0f13a0ee6f702256482b5eb29d7fa2aa840bfc7\n"
    },
    {
      "commit": "d0675ede6de2249256d20271a19ccbf9f11745b8",
      "tree": "e93905f2d93f99902c2e18180bb747ab916593bc",
      "parents": [
        "5d4478556299c656b5bb940e83277e01233ec015"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Thu Apr 28 19:50:21 2011 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Thu Apr 28 19:50:21 2011 -0700"
      },
      "message": "get rid of dependency on copybit HAL module\n\nChange-Id: Ia608099a2426c11a91d33063ba53c93e1eccb428\n"
    },
    {
      "commit": "38ccae2c0324daa305f3fe77d25fdf5edec0b0e1",
      "tree": "c7aec92091f634a6994ed7e836a2a1ba4e22c035",
      "parents": [
        "7fb4b427d5fca79c09d69b212ddca41539c215a2"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Mar 28 18:37:07 2011 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Apr 05 12:05:41 2011 -0700"
      },
      "message": "New fix for issue 4111672: control block flags\n\nThe first fix (commit 913af0b4) is problematic because it makes threads\nin mediaserver process block on the cblk mutex. This is not permitted\nas it can cause audio to skip or worse have a malicious application\nprevent all audio playback by keeping the mutex locked.\n\nThe fix consists in using atomic operations when modifying the control\nblock flags.\n\nAlso fixed audio_track_cblk_t::framesReady() so that it doesn\u0027t block\nwhen called from AudioFlinger (only applies when a loop is active).\n\nChange-Id: Ibf0abb562ced3e9f64118afdd5036854bb959428\n"
    },
    {
      "commit": "0ab985cf1ec0110022be22ff03aa300bb59b9c96",
      "tree": "a6f42d12a60afb0c8ac74e26d7624d68db849e7c",
      "parents": [
        "00d48b9495265457dfb265e766296212b5447b0e"
      ],
      "author": {
        "name": "Romain Guy",
        "email": "romainguy@google.com",
        "time": "Thu Mar 17 11:06:57 2011 -0700"
      },
      "committer": {
        "name": "Romain Guy",
        "email": "romainguy@android.com",
        "time": "Thu Mar 17 12:04:04 2011 -0700"
      },
      "message": "Send WebView the current transform and whether we\u0027re drawing a layer.\nBug #3275491\n\nThese can be used by WebView to correctly apply alpha and geometric\ntransforms.\n\nChange-Id: I2ecd4376d68df886dead3c9240317de33f56828f\n"
    },
    {
      "commit": "1703cdfee717b1b312bf8979816a9e2f16a82e5d",
      "tree": "eb9d3cfe8ffebe45679de91af6f9ffd676ca5067",
      "parents": [
        "fbb1909036ba7de3d9fb8738daba60b357881153"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Mon Mar 07 14:52:59 2011 -0800"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Mar 08 16:33:15 2011 -0800"
      },
      "message": "Fix issue 3439872: video chat and bluetooth SCO\n\nThis change fixes the stability problems experienced when using\na bluetooth headset supporting both A2DP and SCO. Problems occur\nwhen starting the video chat at which time the A2DP output is being\nstopped to start SCO. At that time, active AudioTracks are invalidated\nby AudioFlinger so that a new AudioTrack binder interface can be\nrecreated by the client process on the new mixer thread with correct parameters.\nThe problem was that the process to restore the binder interface was not\nprotected against concurrent requests which caused 2 binder interfaces\nto be created sometimes. This could lead to permanent client deadlock\nif one of the client threads was waiting for a condition of the first\ncreated binder interface while the second one was created (as the AudioFlinger\nwould only signal conditions on the last one created).\nThis concurrent request situation is more likely to happen when a client\nuses the JAVA AudioTrack as the JNI implementation uses simultaneously the\nnative AudioTrack callback and write push mechanisms. By doing so, the code\nthat checks if the binder interface should be restored (in obtainBuffer()) is\nmuch more likely to be called concurrently from two different threads.\n\nThe fix consists in protecting the critical binder interface restore phase\nwith a flag in the AudioTrack control block. The first thread acting upon the binder\ninterface restore request will raise the flag and the second thread will just wait for\na condition to be signaled when the restore process is complete.\n\nAlso protected all accesses to the AudioTrack control block by a mutex to prevent\naccess while the track is being destroyed and restored. If a mutex cannot be held\n(e.g because we call a callback function), acquire a strong reference on the IAudioTrack\nto prevent its destruction while the cblk is being accessed.\n\nModified AudioTrack JNI to use GetByteArrayElements() instead of\nGetPrimitiveArrayCritical() when writing audio buffers. Entering a critical section would\ncause the JNI to abort if a mediaserver crash occurs during a write due to the AudioSystem\ncallback being called during the critical section when media server process restarts.\nAnyway with current JNI implementation, either versions do not copy data most of the times\nand the criticial version does not guaranty no data copy.\n\nThe same modifications have been made to AudioRecord.\n\nChange-Id: Idc5aa711a04c3eee180cdd03f44fe17f3c4dcb52\n"
    },
    {
      "commit": "196855ed4eb4681c4d3504438706caf6b505c9d6",
      "tree": "918f3e894052911861838533796705c962712e13",
      "parents": [
        "6fa83fbad4bf779c6677d525d434f0738726465e"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon Feb 28 18:09:43 2011 -0800"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue Mar 01 14:09:06 2011 -0800"
      },
      "message": "Add support for up to 32 buffers per Surface\n\nBug: 3488016\n\nChange-Id: Ie5536ad77d42a4d0e8270e0fd87ecb73471bcbbc\n"
    },
    {
      "commit": "9383d1a2197479e4d2ac4571c7fbe424f93e3b93",
      "tree": "cbe9c93cd1adf5561c007dc5719a69ca3607b53f",
      "parents": [
        "91a685f1eaa32cadb461755fb235239b308953c9"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Wed Jan 19 18:02:20 2011 -0800"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Thu Jan 20 12:10:11 2011 -0800"
      },
      "message": "clean-up unneeded code\n\nnow that we removed the notion of a \"inUse\" buffer in surfaceflinger\na lot of code can be simplified / removed.\n\nnoteworthy, the whole concept of \"unlockClient\" wrt. \"compositionComplete\"\nis also gone.\n\nChange-Id: I210413d4c8c0998dae05c8620ebfc895d3e6233d\n"
    },
    {
      "commit": "181a379b43c1e85389e8bb60825d9b608502717a",
      "tree": "ca11523e4668750b8d37c1f3c4aaa3cb3fd10416",
      "parents": [
        "03dfce9672b36c1a334959a602f909b8410bec50"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Wed Dec 08 16:40:01 2010 -0800"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Wed Dec 08 16:48:28 2010 -0800"
      },
      "message": "fix [3259708] Graphic Buffer Mapper does not support YV12\n\nremove a bunch of a code that was there only to support broken gralloc implementations\n\nChange-Id: I3c1a9172224cbcc283601abfbbd695a20815451f\n"
    },
    {
      "commit": "effae7fc1aab5354aae649d958db3c8ed77cafa7",
      "tree": "24879af9380d3e83d02e451e652108ce3e6f2d54",
      "parents": [
        "5f0cb5c62553125715dbbb171f0b81e4b7c6d6ac"
      ],
      "author": {
        "name": "Jamie Gennis",
        "email": "jgennis@google.com",
        "time": "Tue Nov 02 11:51:32 2010 -0700"
      },
      "committer": {
        "name": "Jamie Gennis",
        "email": "jgennis@google.com",
        "time": "Thu Nov 11 14:06:38 2010 -0800"
      },
      "message": "Implement reducing the buffer count of a Surface.\n\nChange-Id: I7f979c60c06d654aa8265002836277434bc1a64f\nBug: 3095167\n"
    },
    {
      "commit": "ce0febae177d1816ee7a6750ed9fba52472b9a71",
      "tree": "6e6283e217fc18d53b63652e1d3fe9da2487919f",
      "parents": [
        "85d9b4225d024bb0d602b48bd6d5219cbebd7b8e"
      ],
      "author": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Mon Nov 08 16:04:27 2010 -0800"
      },
      "committer": {
        "name": "James Dong",
        "email": "jdong@google.com",
        "time": "Mon Nov 08 16:52:59 2010 -0800"
      },
      "message": "Support extracting thumbnail from rotated video tracks\n\nChange-Id: Ife0a2536aaac5ff1efdf1035b9d2c892773ee16c\n"
    },
    {
      "commit": "50817931e4cb4ae0019fd13c831a2839349834c5",
      "tree": "1492e3966d068becf59073b25ab7c23366dbbdeb",
      "parents": [
        "a007e8229fb2be4866c483f9cd6c4af238a2da5e"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri Oct 01 16:22:41 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon Oct 04 20:10:11 2010 -0700"
      },
      "message": "fix [2835280] Add support for cancelling buffers to ANativeWindow\n\nThere is a new ANativeWindow::cancelBuffer() API that can be used to\ncancel any dequeued buffer, BEFORE it\u0027s been enqueued. The buffer is\nreturned to the list of availlable buffers. dequeue and cancel are not\nmutually thread safe, they must be called from the same thread or\nexternal synchronization must be used.\n\nChange-Id: I86cc7985bace8b6a93ad2c75d2bef5c3c2cb4d61\n"
    },
    {
      "commit": "44d9848d6656777a18019223e0d35f2fcc67719a",
      "tree": "fe71003d3400dcbdfe078f8d8fad1b1fde960b2c",
      "parents": [
        "922855214d0e8ae4159794d7f751f780b3243552"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Sep 30 16:12:31 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Sep 30 17:21:23 2010 -0700"
      },
      "message": "Issue 3032913: improve AudioTrack recovery time\n\nThis issue showed that when an AudioTrack underruns during a too long period\nof time and is therefore disabled by audioflinger mixer, it takes an additional\ndelay of up to 3 seconds to recover.\nThis fix adds a simple mechanism to recover immediately when the client application\nis ready to write data again in the AudioTrack buffer\n\nAlso throttle warnings on record overflows\n\nChange-Id: I8b2c71578dd134b9e60a15ee4d91b70f3799cb3d\n"
    },
    {
      "commit": "d7c43d3d1ec96e3e3a9ed1faf3ccb2edc949b390",
      "tree": "f9b24515784310f4055f3a9cc3e2eec071a9b778",
      "parents": [
        "640a72ecf2feb1ee5152d70234ff48d3be0e5ddf"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Thu Aug 26 17:42:27 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Thu Aug 26 17:42:27 2010 -0700"
      },
      "message": "fix a race in SF buffer management\n\nalso remove some unused code.\n\nChange-Id: Iae2c3309b7a08055f3e13a5b866c5c084993e352\n"
    },
    {
      "commit": "92235649a45e1b84f43e3c906c57eea7886a426c",
      "tree": "38e6a9b92fe3b249553964bd9fb59963b2a4cccf",
      "parents": [
        "01f0908b3e8c759a9fcd565f6bc6cc6c4033678f"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Thu Aug 19 17:01:19 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue Aug 24 15:40:50 2010 -0700"
      },
      "message": "fix [2931513] Add support for setting the orientation of an ANativeWindow\n\nAlso implement support for cropping.\n\nChange-Id: Iba5888dd242bf2feaac9e9ce26e404c1f404c280\n"
    },
    {
      "commit": "be1ad8d186d0db6e0a3c8885c95a354cbbfc52af",
      "tree": "e1f9f9723f7c2d3027efb665482a4530f383adcf",
      "parents": [
        "163fbcf84010b98e0374110454d85b804bc8d13b"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue Jul 27 20:11:35 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue Jul 27 20:11:35 2010 -0700"
      },
      "message": "fix [2873058] Surface::dequeueBuffer blocks on last buffer, i.e. cannot dequeue all allocated buffers at once.\n\nthis situation happened when the last buffer needed to be resized\n(or allocated, the first time). the assumption was that the buffer\nwas in use by SF itself as the current buffer (obviously, this\nassumption made no sense when the buffer had never been allocated, btw).\n\nthe system would wait until some other buffer became the \"front\" buffer.\n\nwe fix this problem by entirely removing the requirement that the\nbuffer being resized cannot be the front buffer. instead, we just\nallocate a new buffer and replace the front buffer by the new one.\n\nthe downside is that this uses more memory (an extra buffer) for a\nbrief amount of time while the old buffer is being reallocated and\nbefore it has actually been replaced.\n\nChange-Id: I022e4621209474ceb1c671b23deb4188eaaa7285\n"
    },
    {
      "commit": "628eff9967c4efd04204656d9756df9e32cf523c",
      "tree": "1b87d7b8c0eb1fac2c535c899f5761e9bf543558",
      "parents": [
        "623a0de03d72c17b4cf0701280c6cb1df365ea6c"
      ],
      "author": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Thu Apr 22 18:58:52 2010 -0700"
      },
      "committer": {
        "name": "Jeff Brown",
        "email": "jeffbrown@google.com",
        "time": "Sun Jun 13 17:42:16 2010 -0700"
      },
      "message": "Native input dispatch rewrite work in progress.\n\nThe old dispatch mechanism has been left in place and continues to\nbe used by default for now.  To enable native input dispatch,\nedit the ENABLE_NATIVE_DISPATCH constant in WindowManagerPolicy.\n\nIncludes part of the new input event NDK API.  Some details TBD.\n\nTo wire up input dispatch, as the ViewRoot adds a window to the\nwindow session it receives an InputChannel object as an output\nargument.  The InputChannel encapsulates the file descriptors for a\nshared memory region and two pipe end-points.  The ViewRoot then\nprovides the InputChannel to the InputQueue.  Behind the\nscenes, InputQueue simply attaches handlers to the native PollLoop object\nthat underlies the MessageQueue.  This way MessageQueue doesn\u0027t need\nto know anything about input dispatch per-se, it just exposes (in native\ncode) a PollLoop that other components can use to monitor file descriptor\nstate changes.\n\nThere can be zero or more targets for any given input event.  Each\ninput target is specified by its input channel and some parameters\nincluding flags, an X/Y coordinate offset, and the dispatch timeout.\nAn input target can request either synchronous dispatch (for foreground apps)\nor asynchronous dispatch (fire-and-forget for wallpapers and \"outside\"\ntargets).  Currently, finding the appropriate input targets for an event\nrequires a call back into the WindowManagerServer from native code.\nIn the future this will be refactored to avoid most of these callbacks\nexcept as required to handle pending focus transitions.\n\nEnd-to-end event dispatch mostly works!\n\nTo do: event injection, rate limiting, ANRs, testing, optimization, etc.\n\nChange-Id: I8c36b2b9e0a2d27392040ecda0f51b636456de25\n"
    },
    {
      "commit": "36ef8cf54e2bf2f96b8c7f47cd534c00ccb7b64f",
      "tree": "ea437c86609ee36a52c071cd066d029793633639",
      "parents": [
        "ddcc4a66d848deef6fb4689e64e30cd9bd2684fe"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue Jun 08 19:54:15 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue Jun 08 20:10:02 2010 -0700"
      },
      "message": "allow re-targetting of surfaces\n\nSurfaces can now be parcelized and sent to remote\nprocesses. When a surface crosses a process\nboundary, it looses its connection with the\ncurrent process and gets attached to the new one.\n\nChange-Id: I39c7b055bcd3ea1162ef2718d3d4b866bf7c81c0\n"
    },
    {
      "commit": "cbbf27f76b4798cbd91feb70d7555dac0cbf85cb",
      "tree": "86f01bba0af27f8bfc9a8f28c9ecab3f52f3d022",
      "parents": [
        "a21b4e224e8622c0e3280c33b8ebd24fcc515580"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue Jun 01 15:12:58 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri Jun 04 18:57:41 2010 -0700"
      },
      "message": "split surface management from surface\u0027s buffers management\n\nChange-Id: If3c5655d1231f8f0c49ba68f972b1b20c93b3f87\n"
    },
    {
      "commit": "be916aa1267e2e6b1c148f51d11bcbbc79cb864c",
      "tree": "7e2be6182cde7d023ae9afec28463d69d231d7bc",
      "parents": [
        "c282e3eee921453fc9188705b4879d6289b71f9c"
      ],
      "author": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Tue Jun 01 23:49:17 2010 -0700"
      },
      "committer": {
        "name": "Eric Laurent",
        "email": "elaurent@google.com",
        "time": "Thu Jun 03 03:21:53 2010 -0700"
      },
      "message": "Issue 2667801: [Audio Effect Framework] AudioFlinger, AudioMixer AudioTrack modifications.\n\nFirst drop of audio framework modifications for audio effects support.\n\n- AudioTrack/AudioRecord:\nAdded support for auxiliary effects in AudioTrack\nAdded support for audio sessions\nFixed left right channel inversion in setVolume()\n\n- IAudioFlinger:\nAdded interface methods for effect enumeraiton and instantiation\nAdded support for audio sessions.\n\n- IAudioTrack:\nAdded method to attach auxiliary effect.\n\n- AudioFlinger\nCreated new classes to control effect engines in effect library and manage effect connections to tracks or\noutput mix:\n  EffectModule: wrapper object controlling the effect engine implementation in the effect library. There\n\tis one EffectModule per instance of an effect in a given audio session\n  EffectChain: group of effects associated to one audio session. There is one EffectChain per audio session.\n\tEffectChain for session 0 is for output mix effects, other chains are attached to audio tracks\n\twith same session ID. Each chain contains a variable number of EffectModules\n  EffectHandle: implements the IEffect interface. There is one EffectHandle object for each application\n\tcontrolling (or using) an effect module. THe EffectModule maintians a list of EffectHandles.\n\nAdded support for effect modules and effect chains creation in PlaybackThread.\nmodified mixer thread loop to allow track volume control by effect modules and call effect processing.\n\n-AudioMixer\nEach track now specifies its output buffer used by mixer for accumulation\nModified mixer process functions to process tracks by groups of tracks with same buffer\nModified track process functions to support accumulation to auxiliary channel\n\nChange-Id: I26d5f7c9e070a89bdd383e1a659f8b7ca150379c\n"
    },
    {
      "commit": "ba0fab325cd8379378a2c8ad14dd1c44bf2760f3",
      "tree": "71db14ce33c3c0642152d98376feeceb5ad6353d",
      "parents": [
        "aed27b016043c9f2cb33cf851f20698130be110c"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri May 28 14:22:23 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri May 28 17:19:16 2010 -0700"
      },
      "message": "more clean-up in preparation of bigger changes\n\nthe most important change here is the renaming of\nISurfaceFlingerClient to ISurfaceComposerClient\n\nChange-Id: I94e18b0417f50e06f21377446639c61f65f959b3\n"
    },
    {
      "commit": "3f6b0cdd8cd57e2cca56a5dd4cfa726b9185d2e8",
      "tree": "e5d25b48359d27a362e3db605736629f2a4c2e09",
      "parents": [
        "fb6ae6666644c9a37a5d34dd03eb637333cf946b"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue May 25 17:51:34 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue May 25 17:51:34 2010 -0700"
      },
      "message": "fix [2712278] The preview buffer left some black borders in left and bottom edges\n\nwe were incorrectly flagging push_buffer surfaces as invalid\n\nChange-Id: I4dfd4ffbbe8a71f7e23e835db8d71966416c29bb\n"
    },
    {
      "commit": "fb6ae6666644c9a37a5d34dd03eb637333cf946b",
      "tree": "003b7afd1dc7507f230900ab80b90ef4c2d8ec23",
      "parents": [
        "68f929b84acf0c985b9ae3157322c022798e5eb2"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri May 21 17:24:35 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon May 24 18:26:01 2010 -0700"
      },
      "message": "added the notion of fixed-size buffers\n\nthe new native_window_set_buffers_geometry allows\nto specify a size and format for all buffers to be\ndequeued. the buffer will be scalled to the window\u0027s\nsize.\n\nChange-Id: I2c378b85c88d29cdd827a5f319d5c704d79ba381\n"
    },
    {
      "commit": "68f929b84acf0c985b9ae3157322c022798e5eb2",
      "tree": "07960003b243ae58aeecabf83a4e47c78e5d83b6",
      "parents": [
        "1cb8fa1e670786bf83ccde7571c5ac1fc087d4f1"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri May 21 14:51:33 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon May 24 13:47:24 2010 -0700"
      },
      "message": "fix a bug when reallocating a window\u0027s buffers is needed\n\nwe need to mark the buffers that need to be reallocated,\nNOT the buffer\u0027s indices.\n\nChange-Id: I809e2e1b03b56c4d2ab983c25523dae99aa1da74\n"
    },
    {
      "commit": "082a4d89ae4bd156052346bbac7031ed7d741c9d",
      "tree": "3a628b33555c747fa45da6ae566490a0e281bc3d",
      "parents": [
        "1f5be9e90868b92b99868fef232fe973f9d58713"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri May 21 14:19:50 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Fri May 21 14:34:32 2010 -0700"
      },
      "message": "added native_window_set_buffer_count()\n\nthis method can be used to change the number of buffers\nassociated to a native window. the default is two.\n\nChange-Id: I608b959e6b29d77f95edb23c31dc9b099a758f2f\n"
    },
    {
      "commit": "dd9a3a7cb9bd5f68bc6b1fe709e10b6bd1f5b433",
      "tree": "34c1de4abc49bbb44f74e959e723344799eceb36",
      "parents": [
        "956c553ab0ce72f8074ad0fda2ffd66a0305700c"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Tue May 18 17:06:55 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Thu May 20 18:00:42 2010 -0700"
      },
      "message": "fix the threading issue for setBuffercount()\n\nthis change introduces R/W locks in the right places.\non the server-side, it guarantees that setBufferCount()\nis synchronized with \"retire\" and \"resize\".\non the client-side, it guarantees that setBufferCount()\nis synchronized with \"dequeue\", \"lockbuffer\" and \"queue\"\n"
    },
    {
      "commit": "e1f61055b4abb96a86d1ff24b5a7777dfe40fe5f",
      "tree": "8674f05b32d3abbadbbdc251e65c9936bc135ab2",
      "parents": [
        "d1b449aad6c087a69f5ec66b7facb2845b73f1cb"
      ],
      "author": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon May 17 17:27:26 2010 -0700"
      },
      "committer": {
        "name": "Mathias Agopian",
        "email": "mathias@google.com",
        "time": "Mon May 17 17:27:26 2010 -0700"
      },
      "message": "fix some bugs in SharedBufferStack::resize\n\nadded buffers should now be labeled properly.\n\nChange-Id: I28aa753fbe89ab89134e7753575319478934c7fa\n"
    }
  ],
  "next": "d1b449aad6c087a69f5ec66b7facb2845b73f1cb"
}
