<feed xmlns='http://www.w3.org/2005/Atom'>
<title>android_frameworks_ex/variablespeed/jni/variablespeed.cc, branch stable/cm-11.0</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<link rel='alternate' type='text/html' href='https://git.replicant.us/mirrors/LineageOS/android_frameworks_ex/'/>
<entry>
<title>Fix AudioEngine to allow re-initialization - DO NOT MERGE</title>
<updated>2014-03-06T16:58:27+00:00</updated>
<author>
<name>Jay Shrauner</name>
<email>shrauner@google.com</email>
</author>
<published>2014-02-26T18:08:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.replicant.us/mirrors/LineageOS/android_frameworks_ex/commit/?id=ce2b95ae200332495b348be07f77fe60b6c23dcc'/>
<id>ce2b95ae200332495b348be07f77fe60b6c23dcc</id>
<content type='text'>
Add AudioEngine::CompareAndSetEngine and change
VariableSpeed::initializeEngine to use this method so it only initializes
a new engine once rather than asserting on subsequent calls.

Change AudioEngine::DeleteEngine so it ignores repeated calls instead of
asserting. Add VariableSpeed::isReadyToPlay so callers can detect when
the audio library has been properly initialized.

Bug:11511992
Change-Id: I4517cb2ab4c186da43dffc7dbc2a9ad49000059f
(cherry picked from commit 8502b724a9fdc104e7b4a3aba1641e101b4c7be9)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Add AudioEngine::CompareAndSetEngine and change
VariableSpeed::initializeEngine to use this method so it only initializes
a new engine once rather than asserting on subsequent calls.

Change AudioEngine::DeleteEngine so it ignores repeated calls instead of
asserting. Add VariableSpeed::isReadyToPlay so callers can detect when
the audio library has been properly initialized.

Bug:11511992
Change-Id: I4517cb2ab4c186da43dffc7dbc2a9ad49000059f
(cherry picked from commit 8502b724a9fdc104e7b4a3aba1641e101b4c7be9)
</pre>
</div>
</content>
</entry>
<entry>
<title>Initialize requested interfaces array</title>
<updated>2012-07-03T22:59:04+00:00</updated>
<author>
<name>Glenn Kasten</name>
<email>gkasten@google.com</email>
</author>
<published>2012-07-03T20:13:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.replicant.us/mirrors/LineageOS/android_frameworks_ex/commit/?id=cd961432e31018599e107ef7bc008fd28d70b0c7'/>
<id>cd961432e31018599e107ef7bc008fd28d70b0c7</id>
<content type='text'>
Bug: 6768181
Change-Id: Ic8ca44594aea8a0e50740fe69270464ccdd7da6c
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Bug: 6768181
Change-Id: Ic8ca44594aea8a0e50740fe69270464ccdd7da6c
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix playback in variable speed audio.</title>
<updated>2011-09-09T13:46:15+00:00</updated>
<author>
<name>Hugo Hudson</name>
<email>hugohudson@google.com</email>
</author>
<published>2011-09-09T13:46:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.replicant.us/mirrors/LineageOS/android_frameworks_ex/commit/?id=efaa38a16baad0f8665ac23f8e0a8ba166daf75d'/>
<id>efaa38a16baad0f8665ac23f8e0a8ba166daf75d</id>
<content type='text'>
- Recent changes to system/media broke variable speed playback.
- Traced to http://go/android-cl/132098 which presumed that variable
  speed playback wasn't using the renamed sample rate field, but we
  had our own copy of the field (it wasn't previously available in the
  api).
- This cl also fixes the TODO by removing our own copy of the fields,
  and using instead the defines from the OpenSL android api directly.

Bug: 5282965
Change-Id: I58033e9299d26d6a05259e4d50708d27fc3fa7e1
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Recent changes to system/media broke variable speed playback.
- Traced to http://go/android-cl/132098 which presumed that variable
  speed playback wasn't using the renamed sample rate field, but we
  had our own copy of the field (it wasn't previously available in the
  api).
- This cl also fixes the TODO by removing our own copy of the fields,
  and using instead the defines from the OpenSL android api directly.

Bug: 5282965
Change-Id: I58033e9299d26d6a05259e4d50708d27fc3fa7e1
</pre>
</div>
</content>
</entry>
<entry>
<title>Enables detailed logging during variable speed playback.</title>
<updated>2011-09-05T09:40:33+00:00</updated>
<author>
<name>Flavio Lerda</name>
<email>flerda@google.com</email>
</author>
<published>2011-09-02T15:40:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.replicant.us/mirrors/LineageOS/android_frameworks_ex/commit/?id=e863816a885b0a0e1a0930969fe3e818f68f2478'/>
<id>e863816a885b0a0e1a0930969fe3e818f68f2478</id>
<content type='text'>
This commit adds support for dynamically enabling logging in the
variable speed library if log.tag.VariableSpeed is set.

After this change, you can enable logging by running:

adb shell setprop log.tag.VariableSpeed 1

Logging will be disabled after reboot or after running:

adb shell setprop log.tag.VariableSpeed ""

The logging in the library is quite verbose, so we do not want to enable
it by default.

Bug: 5253004
Change-Id: I3addde5552093eb0c4926b67245d578a7da0fb7a
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This commit adds support for dynamically enabling logging in the
variable speed library if log.tag.VariableSpeed is set.

After this change, you can enable logging by running:

adb shell setprop log.tag.VariableSpeed 1

Logging will be disabled after reboot or after running:

adb shell setprop log.tag.VariableSpeed ""

The logging in the library is quite verbose, so we do not want to enable
it by default.

Bug: 5253004
Change-Id: I3addde5552093eb0c4926b67245d578a7da0fb7a
</pre>
</div>
</content>
</entry>
<entry>
<title>Allows selecting the audio stream used for playback.</title>
<updated>2011-09-01T11:23:19+00:00</updated>
<author>
<name>Flavio Lerda</name>
<email>flerda@google.com</email>
</author>
<published>2011-08-31T14:49:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.replicant.us/mirrors/LineageOS/android_frameworks_ex/commit/?id=dc442b4d99512bf7c41ee5ceae6c93a3c3568b57'/>
<id>dc442b4d99512bf7c41ee5ceae6c93a3c3568b57</id>
<content type='text'>
Adds setAudioStreamType() to the MediaPlayerProxy interface and
implements it in the variable speed player.

Bug: 5240848
Change-Id: I1bb9fdbee7aa6113c5d5d5a8000e9794800fad9f
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Adds setAudioStreamType() to the MediaPlayerProxy interface and
implements it in the variable speed player.

Bug: 5240848
Change-Id: I1bb9fdbee7aa6113c5d5d5a8000e9794800fad9f
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix the audio stutter during playback.</title>
<updated>2011-08-27T00:21:54+00:00</updated>
<author>
<name>Hugo Hudson</name>
<email>hugohudson@google.com</email>
</author>
<published>2011-08-27T00:21:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.replicant.us/mirrors/LineageOS/android_frameworks_ex/commit/?id=d2772c48b3ba3cb78f814f83f4a65bbac2cf8337'/>
<id>d2772c48b3ba3cb78f814f83f4a65bbac2cf8337</id>
<content type='text'>
- Was using the base pointer from callback context when I meant to be
  using the 'current position' pointer.

Bug: 5114126
Change-Id: Ie9baded973672cd8ac7ffe0f16f1bdf22c8f1030
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Was using the base pointer from callback context when I meant to be
  using the 'current position' pointer.

Bug: 5114126
Change-Id: Ie9baded973672cd8ac7ffe0f16f1bdf22c8f1030
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix a rare crash.</title>
<updated>2011-08-10T14:57:28+00:00</updated>
<author>
<name>Hugo Hudson</name>
<email>hugohudson@google.com</email>
</author>
<published>2011-08-10T14:57:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.replicant.us/mirrors/LineageOS/android_frameworks_ex/commit/?id=64f5ba670d215847192b4ff46dc4538565f2f551'/>
<id>64f5ba670d215847192b4ff46dc4538565f2f551</id>
<content type='text'>
- Crash could be reproduced by seeking to the very end of a voicemail,
  playing the voicemail to see the ui reset to beginning, then
  increasing rate.
- Reason was that during playback, insufficient data has been read to
  read the sample rate and channels, and in that situation the increase
  rate requires constructing the time scaler, which in turn requires
  a valid sample rate and channels.
- Added a test to prove that the bug exists, and to prove the fix which
  is to ignore the rate change call when sample rate and channels not
  known.
- Also added another unit test in the process to verify that it's safe
  to call set rate at any point during the life cycle of the player.

Bug: 5140693
Change-Id: I474e5769f2b72762348534e4d06104af247e8726
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Crash could be reproduced by seeking to the very end of a voicemail,
  playing the voicemail to see the ui reset to beginning, then
  increasing rate.
- Reason was that during playback, insufficient data has been read to
  read the sample rate and channels, and in that situation the increase
  rate requires constructing the time scaler, which in turn requires
  a valid sample rate and channels.
- Added a test to prove that the bug exists, and to prove the fix which
  is to ignore the rate change call when sample rate and channels not
  known.
- Also added another unit test in the process to verify that it's safe
  to call set rate at any point during the life cycle of the player.

Bug: 5140693
Change-Id: I474e5769f2b72762348534e4d06104af247e8726
</pre>
</div>
</content>
</entry>
<entry>
<title>Playback now handles any sample rate and channel combo.</title>
<updated>2011-07-29T10:52:12+00:00</updated>
<author>
<name>Hugo Hudson</name>
<email>hugohudson@google.com</email>
</author>
<published>2011-07-26T19:05:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.replicant.us/mirrors/LineageOS/android_frameworks_ex/commit/?id=0bd6ec5bc06b869131ee0facf38ff02f81f65c10'/>
<id>0bd6ec5bc06b869131ee0facf38ff02f81f65c10</id>
<content type='text'>
Main stuff
- Delayed construction of audio player until after sample rate and
  channels have been read from the first callback.
- Removed all sample rate and channels from outward facing api.
- Remove pause playing and prefetch duration and sample rate hacky code.
- Fixes handling of any sample rate by removing switch statement.
- Fixes a HORRIBLE bug introduced in last cl where I was creating the
  callback context on the stack inside a method call, and using it a
  pointer to it long after the object had been erased from the stack.
  [worse yet: it still mostly worked fine!]

Other
- Fixes an obvious failure case of all tests - duh - I was calling setUp()
  before setting the executor properly, so they were giving NPEs.
- Correct calculation of totalDuration now done on first decode callback.
- This will let us remove MediaPlayer from prepare() in follow up.
- Initializing the engine outside of the PlaybackRunnable, is cleaner.
- Adds static methods for reading duration and position, again so that
  follow up can have accurate get current position rather than best guess.
- Buffers in use for decoding also not created until first decode callback.
- Introduces some wicked-cool OpenSL macro to log api calls, make the
  api calls and check the result value.

Bug: 5048252
Bug: 5048257
Change-Id: I60705fa6c6ab29a35740f22bef76450e8c1d25a2
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Main stuff
- Delayed construction of audio player until after sample rate and
  channels have been read from the first callback.
- Removed all sample rate and channels from outward facing api.
- Remove pause playing and prefetch duration and sample rate hacky code.
- Fixes handling of any sample rate by removing switch statement.
- Fixes a HORRIBLE bug introduced in last cl where I was creating the
  callback context on the stack inside a method call, and using it a
  pointer to it long after the object had been erased from the stack.
  [worse yet: it still mostly worked fine!]

Other
- Fixes an obvious failure case of all tests - duh - I was calling setUp()
  before setting the executor properly, so they were giving NPEs.
- Correct calculation of totalDuration now done on first decode callback.
- This will let us remove MediaPlayer from prepare() in follow up.
- Initializing the engine outside of the PlaybackRunnable, is cleaner.
- Adds static methods for reading duration and position, again so that
  follow up can have accurate get current position rather than best guess.
- Buffers in use for decoding also not created until first decode callback.
- Introduces some wicked-cool OpenSL macro to log api calls, make the
  api calls and check the result value.

Bug: 5048252
Bug: 5048257
Change-Id: I60705fa6c6ab29a35740f22bef76450e8c1d25a2
</pre>
</div>
</content>
</entry>
<entry>
<title>Adds tests for Variable Speed code.</title>
<updated>2011-07-25T19:45:39+00:00</updated>
<author>
<name>Hugo Hudson</name>
<email>hugohudson@google.com</email>
</author>
<published>2011-07-25T16:04:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.replicant.us/mirrors/LineageOS/android_frameworks_ex/commit/?id=9730f15ebbf4b64cd48e0777850e56cb516a9ed4'/>
<id>9730f15ebbf4b64cd48e0777850e56cb516a9ed4</id>
<content type='text'>
The test changes:
- Adds many, many test cases against a MediaPlayerProxy, checking that
  it behaves to the contract of a MediaPlayer.
- Adds the RealMediaPlayer class to check a real MediaPlayer.
- Adds the VariableSpeed class, to check a VariableSpeed instance
  against the same contract as the MediaPlayer.
- Adds an Android.mk for the unit tests.
- Adds also an AndroidManifest.xml for the unit tests.
- Adds some test asset media files (3gpp file and mp3 file).

Required for the test changes:
- Adds a DynamicProxy class to adapt a MediaPlayer as a
  MediaPlayerProxy class, i.e. to test the implementation of
  MediaPlayerProxy, required to avoid writing an adapter.
- Adds a couple of listeners, OnErrorListener and
  OnCompletionListener, that can be waited for synchronously in unit
  tests.

Improvements as a result of the tests:
- During the testing, fixes the case where we weren't throwing
  IllegalStateException if asked for the duration on released player.
- Refactored the create engine, create and realize output mix, create
  and realize audio player, get play interfaces and callbacks, all
  separated into their own static methods.
- This allows me to create the audio player during the main while loop
  actually after the decoding has begun rather than before starting.
  This work is a precursor to using the decoder's report on sample rate
  and channels as the input to these methods.
- slSampleRate and slOutputChannels no longer computed in the
  constructor, but computed when needed in the construction and
  realization of the audio player.

Other changes:
- Remove some overly verbose logs on getDuration() and
  getCurrentPosition().
- Adding the decoder interface to the callback.
- Extract metadata from decoder method now takes the metadata
  interface, so this will be usable from the decoder callack in a follow
  up.
- Temporarily stop getting the metadata out of the decoder, I'm going
  to be doing it on the decoding callback instead.
- Renames the comment in AndroidManifest.xml to describe the
  correct invocation to run the common tests.

Bug: 5048252
Bug: 5048257
Change-Id: Icdc18b19ef89c9924f73128b70aa4696b4e727c5
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The test changes:
- Adds many, many test cases against a MediaPlayerProxy, checking that
  it behaves to the contract of a MediaPlayer.
- Adds the RealMediaPlayer class to check a real MediaPlayer.
- Adds the VariableSpeed class, to check a VariableSpeed instance
  against the same contract as the MediaPlayer.
- Adds an Android.mk for the unit tests.
- Adds also an AndroidManifest.xml for the unit tests.
- Adds some test asset media files (3gpp file and mp3 file).

Required for the test changes:
- Adds a DynamicProxy class to adapt a MediaPlayer as a
  MediaPlayerProxy class, i.e. to test the implementation of
  MediaPlayerProxy, required to avoid writing an adapter.
- Adds a couple of listeners, OnErrorListener and
  OnCompletionListener, that can be waited for synchronously in unit
  tests.

Improvements as a result of the tests:
- During the testing, fixes the case where we weren't throwing
  IllegalStateException if asked for the duration on released player.
- Refactored the create engine, create and realize output mix, create
  and realize audio player, get play interfaces and callbacks, all
  separated into their own static methods.
- This allows me to create the audio player during the main while loop
  actually after the decoding has begun rather than before starting.
  This work is a precursor to using the decoder's report on sample rate
  and channels as the input to these methods.
- slSampleRate and slOutputChannels no longer computed in the
  constructor, but computed when needed in the construction and
  realization of the audio player.

Other changes:
- Remove some overly verbose logs on getDuration() and
  getCurrentPosition().
- Adding the decoder interface to the callback.
- Extract metadata from decoder method now takes the metadata
  interface, so this will be usable from the decoder callack in a follow
  up.
- Temporarily stop getting the metadata out of the decoder, I'm going
  to be doing it on the decoding callback instead.
- Renames the comment in AndroidManifest.xml to describe the
  correct invocation to run the common tests.

Bug: 5048252
Bug: 5048257
Change-Id: Icdc18b19ef89c9924f73128b70aa4696b4e727c5
</pre>
</div>
</content>
</entry>
<entry>
<title>Initial check-in of variable speed playback library.</title>
<updated>2011-07-15T16:32:09+00:00</updated>
<author>
<name>Hugo Hudson</name>
<email>hugohudson@google.com</email>
</author>
<published>2011-07-14T22:31:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.replicant.us/mirrors/LineageOS/android_frameworks_ex/commit/?id=b83ad73794088498d6d38cd3b4fc9311f505d051'/>
<id>b83ad73794088498d6d38cd3b4fc9311f505d051</id>
<content type='text'>
Contains an implementation of time-domain audio scaler, for
pitch-invariant speed up and slow-down of audio.

Contains wrapper library using OpenSLES to pump audio from
encoded stream (mp3 file etc) through audio decoder then
through time scaler and out to media player.

This is written as a jni library with jni hooks to allow
driving of this from the Java side.

The other part of this cl is the Java wrapper.  There is a
new interface MediaPlayerProxy, containing a subset of the
methods found on the MediaPlayer.  The VariableSpeed class
provides a concrete implementation of this interface
adapting to the jni code.

Change-Id: I518d8bf703488628c00730241a08ebfb67588ca6
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Contains an implementation of time-domain audio scaler, for
pitch-invariant speed up and slow-down of audio.

Contains wrapper library using OpenSLES to pump audio from
encoded stream (mp3 file etc) through audio decoder then
through time scaler and out to media player.

This is written as a jni library with jni hooks to allow
driving of this from the Java side.

The other part of this cl is the Java wrapper.  There is a
new interface MediaPlayerProxy, containing a subset of the
methods found on the MediaPlayer.  The VariableSpeed class
provides a concrete implementation of this interface
adapting to the jni code.

Change-Id: I518d8bf703488628c00730241a08ebfb67588ca6
</pre>
</div>
</content>
</entry>
</feed>
