aboutsummaryrefslogtreecommitdiff
path: root/externals/oboe/docs/OpenSLESMigration.md
diff options
context:
space:
mode:
Diffstat (limited to 'externals/oboe/docs/OpenSLESMigration.md')
-rw-r--r--externals/oboe/docs/OpenSLESMigration.md169
1 files changed, 0 insertions, 169 deletions
diff --git a/externals/oboe/docs/OpenSLESMigration.md b/externals/oboe/docs/OpenSLESMigration.md
deleted file mode 100644
index 5846b27e68..0000000000
--- a/externals/oboe/docs/OpenSLESMigration.md
+++ /dev/null
@@ -1,169 +0,0 @@
-OpenSLES Migration Guide
-===
-
-# Introduction
-
-This guide will show you how to migrate your code from [OpenSL ES for Android](https://developer.android.com/ndk/guides/audio/opensl/opensl-for-android) (just OpenSL from now on) to Oboe.
-
-To familiarise yourself with Oboe, please read the [Getting Started guide](https://github.com/google/oboe/blob/main/docs/GettingStarted.md) and ensure that Oboe has been added as a dependency in your project.
-
-
-# Concepts
-
-At a high level, OpenSL and Oboe have some similarities. They both create objects which communicate with an audio device capable of playing or recording audio samples. They also use a callback mechanism to read data from or write data to that audio device.
-
-This is where the similarities end.
-
-Oboe has been designed to be a simpler, easier to use API than OpenSL. It aims to reduce the amount of boilerplate code and guesswork associated with recording and playing audio.
-
-
-# Key differences
-
-
-## Object mappings
-
-OpenSL uses an audio engine object, created using `slCreateEngine`, to create other objects. Oboe's equivalent object is `AudioStreamBuilder`, although it will only create an `AudioStream`.
-
-OpenSL uses audio player and audio recorder objects to communicate with audio devices. In Oboe an `AudioStream` is used.
-
-In OpenSL the audio callback mechanism is a user-defined function which is called each time a buffer is enqueued. In Oboe you construct an `AudioStreamDataCallback` object, and its `onAudioReady` method is called each time audio data is ready to be read or written.
-
-Here's a table which summarizes the object mappings:
-
-
-<table>
- <tr>
- <td><strong>OpenSL</strong>
- </td>
- <td><strong>Oboe </strong>(all classes are in the <code>oboe</code> namespace)
- </td>
- </tr>
- <tr>
- <td>Audio engine (an <code>SLObjectItf</code>)
- </td>
- <td><code>AudioStreamBuilder</code>
- </td>
- </tr>
- <tr>
- <td>Audio player
- </td>
- <td><code>AudioStream</code> configured for output
- </td>
- </tr>
- <tr>
- <td>Audio recorder
- </td>
- <td><code>AudioStream</code> configured for input
- </td>
- </tr>
- <tr>
- <td>Callback function
- </td>
- <td><code>AudioStreamDataCallback::onAudioReady</code>
- </td>
- </tr>
-</table>
-
-
-
-## Buffers and callbacks
-
-In OpenSL your app must create and manage a queue of buffers. Each time a buffer is dequeued, the callback function is called and your app must enqueue a new buffer.
-
-In Oboe, rather than owning and enqueuing buffers, you are given direct access to the `AudioStream`'s buffer through the `audioData` parameter of `onAudioReady`.
-
-This is a container array which you can read audio data from when recording, or write data into when playing. The `numFrames` parameter tells you how many frames to read/write. Here's the method signature of `onAudioReady`:
-
-
-```
-DataCallbackResult onAudioReady(
- AudioStream *oboeStream,
- void *audioData,
- int32_t numFrames
-)
-```
-
-
-You supply your implementation of `onAudioReady` when building the audio stream by constructing an `AudioStreamDataCallback` object. [Here's an example.](https://github.com/google/oboe/blob/main/docs/GettingStarted.md#creating-an-audio-stream)
-
-
-### Buffer sizes
-
-In OpenSL you cannot specify the size of the internal buffers of the audio player/recorder because your app is supplying them so they can have arbitrary size. You can only specify the _number of buffers_ through the `SLDataLocator_AndroidSimpleBufferQueue.numBuffers` field.
-
-By contrast, Oboe will use the information it has about the current audio device to configure its buffer size. It will determine the optimal number of audio frames which should be read/written in a single callback. This is known as a _burst_, and usually represents the minimum possible buffer size. Typical values are 96, 128, 192 and 240 frames.
-
-An audio stream's burst size, given by `AudioStream::getFramesPerBurst()`, is important because it is used when configuring the buffer size. Here's an example which uses two bursts for the buffer size, which usually represents a good tradeoff between latency and glitch protection:
-
-
-```
-audioStream.setBufferSizeInFrames(audioStream.getFramesPerBurst() * 2);
-```
-
-
-**Note:** because Oboe uses OpenSL under-the-hood on older devices which does not provide the same information about audio devices, it still needs to know [sensible default values for the burst to be used with OpenSL](https://github.com/google/oboe/blob/main/docs/GettingStarted.md#obtaining-optimal-latency).
-
-
-## Audio stream properties
-
-In OpenSL you must explicitly specify various properties, including the sample rate and audio format, when opening an audio player or audio recorder.
-
-In Oboe, you do not need to specify any properties to open a stream. For example, this will open a valid output `AudioStream` with sensible default values.
-
-
-```
-AudioStreamBuilder builder;
-builder.openStream(myStream);
-```
-
-
-However, you may want to specify some properties. These are set using the `AudioStreamBuilder` ([example](https://github.com/google/oboe/blob/main/docs/FullGuide.md#set-the-audio-stream-configuration-using-an-audiostreambuilder)).
-
-
-## Stream disconnection
-
-OpenSL has no mechanism, other than stopping callbacks, to indicate that an audio device has been disconnected - for example, when headphones are unplugged.
-
-In Oboe, you can be notified of stream disconnection by overriding one of the `onError` methods in `AudioStreamErrorCallback`. This allows you to clean up any resources associated with the audio stream and create a new stream with optimal properties for the current audio device ([more info](https://github.com/google/oboe/blob/main/docs/FullGuide.md#disconnected-audio-stream)).
-
-
-# Unsupported features
-
-
-## Formats
-
-Oboe audio streams only accept [PCM](https://en.wikipedia.org/wiki/Pulse-code_modulation) data in float or signed 16-bit ints. Additional formats including 8-bit unsigned, 24-bit packed, 8.24 and 32-bit are not supported.
-
-Compressed audio, such as MP3, is not supported for a number of reasons but chiefly:
-
-
-
-* The OpenSL ES implementation has performance and reliability issues.
-* It keeps the Oboe API and the underlying implementation simple.
-
-Extraction and decoding can be done either through the NDK [Media APIs](https://developer.android.com/ndk/reference/group/media) or by using a third party library like [FFmpeg](https://ffmpeg.org/). An example of both these approaches can be seen in the [RhythmGame sample](https://github.com/google/oboe/tree/main/samples/RhythmGame).
-
-
-## Miscellaneous features
-
-Oboe does **not** support the following features:
-
-
-
-* Channel masks - only [indexed channel masks](https://developer.android.com/reference/kotlin/android/media/AudioFormat#channel-index-masks) are supported.
-* Playing audio content from a file pathname or [URI](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier).
-* Notification callbacks for position updates.
-* Platform output effects on API 27 and below. [They are supported from API 28 and above.](https://github.com/google/oboe/wiki/TechNote_Effects)
-
-
-# Summary
-
-
-
-* Replace your audio player or recorder with an `AudioStream` created using an `AudioStreamBuilder`.
-* Use your value for `numBuffers` to set the audio stream's buffer size as a multiple of the burst size. For example: `audioStream.setBufferSizeInFrames(audioStream.getFramesPerBurst * numBuffers)`.
-* Create an `AudioStreamDataCallback` object and move your OpenSL callback code inside the `onAudioReady` method.
-* Handle stream disconnect events by creating an `AudioStreamErrorCallback` object and overriding one of its `onError` methods.
-* Pass sensible default sample rate and buffer size values to Oboe from `AudioManager` [using this method](https://github.com/google/oboe/blob/main/docs/GettingStarted.md#obtaining-optimal-latency) so that your app is still performant on older devices.
-
-For more information please read the [Full Guide to Oboe](https://github.com/google/oboe/blob/main/docs/FullGuide.md).