getWaveformBytes method

  1. @override
Future<List<double>> getWaveformBytes(
  1. Uint8List inputData,
  2. String formatHint,
  3. int numberOfSamples
)
override

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');
  }
}