Overview
coast_audio_miniaudio
is an extension package for coast_audio using miniaudio.
You can use this package to implement audio capture, playback and many other audio capabilities on Android, iOS and macOS.
Features
- Audio Capture and Playback
Core Audio(iOS/macOS)
,OpenSL ES(Android)
andAAudio(Android)
are supported
- Device Enumeration
- PCM Format Conversion
- Filtering
- HPF, LPF, HSF, LSF, and PeakingEQ filters
- Decoding
- MP3, FLAC and WAV formats
- Encoding
- WAV format
Setup
This package calls native functions by using ffi.
To do so, you have to link the mabridge
library into your application.
Prebuilt binaries are located at mabridge/prebuilt.
If you are a Flutter user, use the flutter_coast_audio_miniaudio package which handles this setup step automatically.
MabDevice
MabDevice
is an abstract class for interacting audio devices by using ma_device
and ma_context
APIs.
For capturing, use the MabCaptureDevice
and for playback, use the MabPlaybackDevice
.
A default audio device will be used if no device
parameter is specified.
This example plays the loopback audio for 10 seconds.
MabDeviceContext.enableSharedInstance(
backends: [
MabBackend.coreAudio, // Use the Core Audio backend for iOS/macOS
MabBackend.aaudio, // Use the AAudio backend for Android
],
);
const format = AudioFormat(sampleRate: 48000, channels: 2);
final captureDevice = MabCaptureDevice(
context: MabDeviceContext.sharedInstance, // You should use the same device context on all MabDevice instances.
format: format,
bufferFrameSize: 2048, // bufferFrameSize will be used to store the captured data. For low-latency use cases, set this field to smaller size.
);
final playbackDevice = MabPlaybackDevice(
context: MabDeviceContext.sharedInstance,
format: format,
bufferFrameSize: 2048,
);
// Initialize nodes.
final captureNode = MabCaptureDeviceNode(device: captureDevice);
final playbackNode = MabPlaybackDeviceNode(device: playbackDevice);
final graphNode = GraphNode();
// Connect nodes.
graphNode.connect(captureNode.outputBus, playbackNode.inputBus);
graphNode.connectEndpoint(playbackNode.outputBus);
// Start input and output devices.
captureDevice.start();
playbackDevice.start();
final task = AudioTask(
clock: AudioIntervalClock(const Duration(milliseconds: 16)),
format: format,
framesRead: 2048,
endpoint: graphNode.outputBus,
);
// Start reading audio periodically.
task.start();
// Wait for 10 seconds.
await Future<void>.delayed(const Duration(seconds: 10));
// Dispose all resources.
task.dispose();
captureDevice.dispose();
playbackDevice.dispose();
MabAudioDecoder
MabAudioDecoder
is a decoder class for decoding mp3, flac and wav data from a file by using ma_decoder
API.
This class implements an AudioDecoder
abstract class so you can use it on the DecoderNode
.
final dataSource = AudioFileDataSource(file: File('example.mp3'), mode: FileMode.read);
final decoder = MabAudioDecoder(
dataSource: dataSource,
outputFormat: _player.format,
);
final decoderNode = DecoderNode(decoder: decoder);
// do some stuff...
decoderNode.dispose();
decoder.dispose();
dataSource.dispose();
Filtering
These filters are supported in this package.
- Low/High Pass Filter
- Low/High Shelf Filter
- Peaking EQ Filter
You can initialize the MabFilterNode
instance by passing a filter above.
final node = MabFilterNode(
format: format,
filter: MabPeakingEQFilter(format: format, gainDb: 5, q: 1, frequency: 1000),
);
Libraries
- coast_audio_miniaudio
- Support for doing something awesome.
- generated/ma_bridge_bindings