extractWaveform method
Future<WaveformData>
extractWaveform({
- required String inputPath,
- int samplesPerSecond = 100,
- 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();
}
}