getWaveformBytes method
Implementation
@override
Future<List<double>> getWaveformBytes(Uint8List inputData, String formatHint, int numberOfSamples) async {
try {
final buffer = await _decodeAudioData(inputData);
final channelData = buffer.getChannelData(0).toDart;
final totalSamples = channelData.length;
if (totalSamples == 0) {
return List.filled(numberOfSamples, 0.0);
}
final samplesPerWindow = max(1, totalSamples ~/ numberOfSamples);
final waveform = <double>[];
var maxRms = 0.0;
for (var i = 0; i < numberOfSamples; i++) {
final start = i * totalSamples ~/ numberOfSamples;
final end = min(start + samplesPerWindow, totalSamples);
if (start >= totalSamples) break;
var sumSquares = 0.0;
for (var j = start; j < end; j++) {
final s = channelData[j];
sumSquares += s * s;
}
final rms = sqrt(sumSquares / (end - start));
waveform.add(rms);
if (rms > maxRms) maxRms = rms;
}
final result = waveform.map((rms) => maxRms > 0 ? rms / maxRms : 0.0).toList();
while (result.length < numberOfSamples) {
result.add(0.0);
}
return result;
} catch (e) {
if (e is AudioConversionException) rethrow;
throw AudioConversionException('Waveform extraction failed: $e');
}
}