getAudioInfo method

  1. @override
Future<AudioInfo> getAudioInfo(
  1. String inputPath
)
override

Gets comprehensive information about an audio file

Analyzes the audio file and returns detailed information including format, duration, quality metrics, and compatibility information.

inputPath - Path to the input audio file

Returns AudioInfo with comprehensive file information. Throws AudioAnalysisException if analysis fails.

Implementation

@override
Future<AudioInfo> getAudioInfo(String inputPath) async {
  try {
    // For web, we can get basic info using HTML Audio element
    final audio = web.HTMLAudioElement();
    final completer = Completer<AudioInfo>();

    void onLoadedMetadata() {
      final durationMs = (audio.duration * 1000).round();
      final format = inputPath.split('.').last.toLowerCase();

      final audioInfo = AudioInfo(
        isValid: true,
        durationMs: durationMs,
        format: format,
        mimeType: _getMimeTypeFromExtension(format),
        channels: 2, // HTML Audio API doesn't expose channel count
        sampleRate: 44100, // Default assumption for web
        bitRate: 128, // Default assumption
        supportedForConversion: false, // Not supported on web
        supportedForTrimming: false, // Not supported on web
        supportedForWaveform: true, // We can generate fake waveforms
      );

      completer.complete(audioInfo);
    }

    void onError() {
      final audioInfo = AudioInfo(
        isValid: false,
        error: 'Failed to load audio file',
        details: 'Web platform could not load the audio file at: $inputPath',
      );
      completer.complete(audioInfo);
    }

    // Set up event listeners
    audio.addEventListener('loadedmetadata', onLoadedMetadata.toJS);
    audio.addEventListener('error', onError.toJS);

    // Set source and load
    audio.src = inputPath;
    audio.load();

    return await completer.future.timeout(
      const Duration(seconds: 10),
      onTimeout:
          () => AudioInfo(
            isValid: false,
            error: 'Audio loading timed out',
            details: 'Failed to load audio information within 10 seconds',
          ),
    );
  } catch (e) {
    return AudioInfo(
      isValid: false,
      error: 'Failed to get audio info on web',
      details: e.toString(),
    );
  }
}