mockingbird_platform_interface
The platform interface for the mockingbird plugin:
the MockingbirdPlatform contract every platform package implements, the plain
data records that cross it, and a shared dart:ffi implementation for the
platforms that link the engine natively.
App code does not depend on this package. Depend on mockingbird, which pulls in the
platform packages for Android, iOS, macOS and web.
The contract
MockingbirdPlatform exposes the engine's operations with plain Dart types and the
C ABI's status codes as integers; the mockingbird package turns codes into
exceptions and records into its typed API:
abstract class MockingbirdPlatform extends PlatformInterface {
Future<void> initialize();
String version();
String statusName(int status);
MockingbirdCreateResult create(MockingbirdNativeConfig config);
void destroy(MockingbirdEngineHandle handle);
int start(MockingbirdEngineHandle handle);
int stop(MockingbirdEngineHandle handle);
int pushPcm(MockingbirdEngineHandle handle, Int16List samples, int captureTsUs);
MockingbirdPcmResult readPcm(MockingbirdEngineHandle handle, int maxSamples);
MockingbirdEventResult pollEvent(MockingbirdEngineHandle handle);
MockingbirdPacketResult drainPacket(MockingbirdEngineHandle handle);
MockingbirdStatsResult stats(MockingbirdEngineHandle handle);
int updateConfig(MockingbirdEngineHandle handle, MockingbirdNativeConfig config);
}
MockingbirdNativeConfig, MockingbirdNativeEvent, MockingbirdNativePacket and
MockingbirdNativeStats mirror the C structs field for field, with no dart:ffi
types, so the main library compiles on every platform including the web.
The FFI implementation
package:mockingbird_platform_interface/ffi.dart holds MockingbirdFfiPlatform, a
complete implementation over the generated bindings. A platform package that
links the engine natively only supplies the library:
class MockingbirdMacOS extends MockingbirdFfiPlatform {
static void registerWith() => MockingbirdPlatform.instance = MockingbirdMacOS();
@override
ffi.DynamicLibrary get nativeLibrary => ffi.DynamicLibrary.process();
}
The web package implements MockingbirdPlatform directly over a WebAssembly
module. Import ffi.dart only from code that never runs on the web.
Regenerating the bindings
The bindings are generated from include/mockingbird/mockingbird.h in the engine
repository with ffigen:
dart run ffigen --config ffigen.yaml
Run it after any change to the header, then re-run the tests of mockingbird.
Libraries
- ffi
- The
dart:ffiimplementation shared by the Android, iOS and macOS packages. Not for use on the web. - mockingbird_platform_interface
- The platform interface of the mockingbird plugin: plain data types and the engine operations every platform implementation provides.