startAudioStream method

Future<void> startAudioStream({
  1. required Future<StreamSubscription?> getAudioStream({
    1. required dynamic onAudioReceived(
      1. List<int>
      ),
    }),
  2. 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;
  }
}