Send real-time PCM audio (16-bit integer) to your device speakers, from your Flutter app!
No Dependencies
FlutterPcmSound has zero dependencies besides Flutter, Android, iOS, and MacOS themselves.
Not for Audio Files
Unlike other plugins, flutter_pcm_sound
does not use audio files (For example: sound_pool).
Instead, flutter_pcm_sound
is for apps that generate audio in realtime a few milliseconds before you hear it. For example, using dart_melty_soundfont.
Callback Based, For Real-Time Audio
In contrast to raw_sound, FlutterPcmSound uses a callback setFeedCallback
to signal when to feed more samples.
You can lower the feed threshold using setFeedThreshold
to achieve real time audio, or increase it to have a cushy buffer.
You can also manually feed
whenever you like.
ignore feed threshold
To monitor remaining samples in real-time, you can use setFeedThreshold(-1)
.
We will invoke your callback 30-100 times per second regardless of how many samples remain.
iOS is a stable ~100htz.
Android is less predictable. Figure around ~30-60htz.
Usage
// for testing purposes, a C-Major scale
MajorScale scale = MajorScale(sampleRate: 44100, noteDuration: 0.25);
// invoked whenever we need to feed more samples to the platform
void onFeed(int remainingFrames) async {
// you could use 'remainingFrames' to feed very precisely.
// But here we just load a few thousand samples everytime we run low.
List<int> frame = scale.generate(periods: 100);
await FlutterPcmSound.feed(PcmArrayInt16.fromList(frame));
}
await FlutterPcmSound.setup(sampleRate: 44100, channelCount: 1);
await FlutterPcmSound.setFeedThreshold(8000); // feed when below 8000 queued frames
await FlutterPcmSound.setFeedCallback(onFeed);
await FlutterPcmSound.play();
Other Functions
// clears all queued samples
await FlutterPcmSound.clear();
// suspend playback & clear queued samples
await FlutterPcmSound.stop(clear: true);
// get the current number of queued frames
int samples = await FlutterPcmSound.remainingFrames();
⭐ Stars ⭐
Please star this repo & on pub.dev. We all benefit from having a larger community.
Example App
Enable the platforms you need.
cd ./example
flutter config --enable-macos-desktop
flutter config --enable-android
flutter config --enable-ios
flutter create .
flutter run