startAudioStream method
Future<void>
startAudioStream({
- required Future<
StreamSubscription?> getAudioStream({}), - AudioCodec? codec,
Implementation
Future<void> startAudioStream({
required Future<StreamSubscription?> Function({
required Function(List<int>) onAudioReceived,
}) getAudioStream,
AudioCodec? codec,
}) async {
if (!_isInitialized) {
throw Exception('AudioManager not initialized. Call initialize() first.');
}
if (_isStreaming) {
await _log('Audio stream already active, stopping existing stream');
await stopAudioStream();
}
try {
_currentCodec = codec ?? AudioCodec.opus;
_sampleRate = _currentCodec!.sampleRate;
_resetProcessing();
// Initialize Opus decoder for this stream
if (_currentCodec == AudioCodec.opus ||
_currentCodec == AudioCodec.opusFS320) {
if (!_opusInitialized) {
throw Exception('Opus not initialized. Cannot decode Opus audio.');
}
_opusDecoder = SimpleOpusDecoder(
sampleRate: _sampleRate,
channels: 1,
);
await _log('Opus decoder created for ${_sampleRate}Hz mono');
}
await _log('=== STARTING AUDIO STREAM ===');
await _log('Codec: $_currentCodec');
await _log('Sample rate: $_sampleRate Hz');
await _log('=============================');
_audioSubscription = await getAudioStream(
onAudioReceived: (data) {
if (!_audioDataController.isClosed && data.isNotEmpty) {
try {
_processAudioPacket(data);
} catch (e) {
_log('Error processing audio packet: $e');
}
}
},
);
if (_audioSubscription != null) {
_isStreaming = true;
await _log('Audio stream started successfully');
} else {
throw Exception('Failed to create audio stream subscription');
}
} catch (e) {
_isStreaming = false;
await _log('Failed to start audio stream: $e');
rethrow;
}
}