extractWaveform method

  1. @override
Future<WaveformData> extractWaveform({
  1. required String inputPath,
  2. int samplesPerSecond = 100,
  3. ProgressCallback? onProgress,
})
override

Extracts waveform amplitude data from an audio file

Analyzes the audio file and extracts amplitude values for visualization. The extracted data can be used to create waveform displays in your UI.

inputPath - Path to the input audio file samplesPerSecond - Number of amplitude samples per second (default: 100) onProgress - Optional callback for extraction progress (0.0 to 1.0)

Returns WaveformData containing amplitude values and audio information. Throws WaveformExtractionException if extraction fails.

Implementation

@override
Future<WaveformData> extractWaveform({
  required String inputPath,
  int samplesPerSecond = 100,
  ProgressCallback? onProgress,
}) async {
  // Validate arguments
  _validateFilePath(inputPath, 'inputPath');
  _validateSamplesPerSecond(samplesPerSecond);

  // Set up progress listening
  StreamSubscription<dynamic>? progressSub;
  if (onProgress != null) {
    progressSub = _progressChannel.receiveBroadcastStream().listen((data) {
      if (data is Map && data['operation'] == 'extract') {
        final progress = data['progress'] as double?;
        if (progress != null) {
          onProgress(progress);
        }
      }
    });
  }

  try {
    final Map<String, dynamic> arguments = {
      'inputPath': inputPath,
      'samplesPerSecond': samplesPerSecond,
    };

    final result = await methodChannel
        .invokeMethod('extractWaveform', arguments)
        .timeout(const Duration(minutes: 5));

    if (result == null) {
      throw WaveformExtractionException(
        'Waveform extraction failed: No result returned from platform',
        inputPath: inputPath,
        samplesPerSecond: samplesPerSecond,
      );
    }

    // Safely convert the result to Map<String, dynamic>
    final Map<String, dynamic> convertedResult;
    if (result is Map) {
      convertedResult = Map<String, dynamic>.from(result);
    } else {
      throw WaveformExtractionException(
        'Waveform extraction failed: Invalid result type from platform',
        inputPath: inputPath,
        samplesPerSecond: samplesPerSecond,
      );
    }

    return WaveformData(
      amplitudes:
          (convertedResult['amplitudes'] as List<dynamic>).cast<double>(),
      sampleRate: convertedResult['sampleRate'] as int,
      durationMs: convertedResult['durationMs'] as int,
      channels: convertedResult['channels'] as int,
    );
  } on PlatformException catch (e) {
    throw _convertPlatformException(e, WaveformExtractionException.new, {
      'inputPath': inputPath,
      'samplesPerSecond': samplesPerSecond,
    });
  } catch (e) {
    throw WaveformExtractionException(
      'Waveform extraction failed: $e',
      originalError: e,
      inputPath: inputPath,
      samplesPerSecond: samplesPerSecond,
    );
  } finally {
    await progressSub?.cancel();
  }
}