Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/site.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ jobs:
"docs/reference/platform-support.md:docs/reference/platform-support_RU.md"
"docs/reference/presets.md:docs/reference/presets_RU.md"
"docs/troubleshooting.md:docs/troubleshooting_RU.md"
"docs/implementation-plan.md:docs/implementation-plan_RU.md"
"docs/roadmap.md:docs/roadmap_RU.md"
"docs/research/acoustic-1-phy-sources.md:docs/research/acoustic-1-phy-sources_RU.md"
"docs/research/acoustic-2-measurement-sources.md:docs/research/acoustic-2-measurement-sources_RU.md"
Expand Down
110 changes: 109 additions & 1 deletion apps/audio_modem/lib/bridge/wav_bootstrap_bridge.dart
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,30 @@ class WavDecodeResult {
final int samplesConsumed;
}

class WavFileDecodeResult {
const WavFileDecodeResult({
required this.sessionId,
required this.senderCallsign,
required this.profile,
required this.carrier,
required this.fileName,
required this.mimeType,
required this.payload,
required this.sampleRateHz,
required this.samplesConsumed,
});

final int sessionId;
final String senderCallsign;
final String profile;
final String carrier;
final String fileName;
final String mimeType;
final Uint8List payload;
final int sampleRateHz;
final int samplesConsumed;
}

abstract interface class WavBootstrapBridge {
bool get isAvailable;

Expand All @@ -52,22 +76,39 @@ abstract interface class WavBootstrapBridge {
required String carrier,
});

Future<WavBuildResult> encodeFile({
required int sessionId,
required String senderCallsign,
required String fileName,
required String mimeType,
required Uint8List payload,
required String profile,
required String carrier,
});

Future<WavDecodeResult> decodeWav({
required Uint8List wavBytes,
required String carrier,
});

Future<WavFileDecodeResult> decodeWavFile({
required Uint8List wavBytes,
required String carrier,
});
}

class NativeWavBootstrapBridge implements WavBootstrapBridge {
NativeWavBootstrapBridge._();

static Future<void>? _initialization;

static Future<NativeWavBootstrapBridge> create() async {
if (kIsWeb) {
throw UnsupportedError(
'The native Rust WAV bridge is not available in the web build yet.',
);
}
await AudioModemRust.init();
await (_initialization ??= AudioModemRust.init());
return NativeWavBootstrapBridge._();
}

Expand Down Expand Up @@ -98,6 +139,34 @@ class NativeWavBootstrapBridge implements WavBootstrapBridge {
);
}

@override
Future<WavBuildResult> encodeFile({
required int sessionId,
required String senderCallsign,
required String fileName,
required String mimeType,
required Uint8List payload,
required String profile,
required String carrier,
}) async {
final result = await rust.encodeFileToWav(
sessionId: sessionId,
senderCallsign: senderCallsign,
fileName: fileName,
mimeType: mimeType,
payload: payload,
profile: profile,
carrier: carrier,
);
return WavBuildResult(
sessionId: result.sessionId,
profile: result.profile,
carrier: result.carrier,
sampleRateHz: result.sampleRateHz,
wavBytes: result.wavBytes,
);
}

@override
Future<WavDecodeResult> decodeWav({
required Uint8List wavBytes,
Expand All @@ -117,6 +186,28 @@ class NativeWavBootstrapBridge implements WavBootstrapBridge {
samplesConsumed: result.samplesConsumed,
);
}

@override
Future<WavFileDecodeResult> decodeWavFile({
required Uint8List wavBytes,
required String carrier,
}) async {
final result = await rust.decodeWavFile(
wavBytes: wavBytes,
carrier: carrier,
);
return WavFileDecodeResult(
sessionId: result.sessionId,
senderCallsign: result.senderCallsign,
profile: result.profile,
carrier: result.carrier,
fileName: result.fileName,
mimeType: result.mimeType,
payload: result.payload,
sampleRateHz: result.sampleRateHz,
samplesConsumed: result.samplesConsumed,
);
}
}

class UnavailableWavBootstrapBridge implements WavBootstrapBridge {
Expand All @@ -136,9 +227,26 @@ class UnavailableWavBootstrapBridge implements WavBootstrapBridge {
required String carrier,
}) => Future.error(StateError(reason));

@override
Future<WavBuildResult> encodeFile({
required int sessionId,
required String senderCallsign,
required String fileName,
required String mimeType,
required Uint8List payload,
required String profile,
required String carrier,
}) => Future.error(StateError(reason));

@override
Future<WavDecodeResult> decodeWav({
required Uint8List wavBytes,
required String carrier,
}) => Future.error(StateError(reason));

@override
Future<WavFileDecodeResult> decodeWavFile({
required Uint8List wavBytes,
required String carrier,
}) => Future.error(StateError(reason));
}
Loading
Loading