fix: selection preset quality returning null

This commit is contained in:
Kingkor Roy Tirtho 2025-11-04 13:45:23 +06:00
parent 6272f376ea
commit e1fa9efa14
2 changed files with 22 additions and 38 deletions

View File

@ -69,7 +69,10 @@ class AudioSourceAvailableQualityPresetsNotifier
if (persistedStateStr != null) { if (persistedStateStr != null) {
state = state =
AudioSourcePresetsState.fromJson(jsonDecode(persistedStateStr)); AudioSourcePresetsState.fromJson(jsonDecode(persistedStateStr))
.copyWith(
presets: audioSource.audioSource.supportedPresets,
);
} else { } else {
state = AudioSourcePresetsState( state = AudioSourcePresetsState(
presets: audioSource.audioSource.supportedPresets, presets: audioSource.audioSource.supportedPresets,

View File

@ -306,6 +306,8 @@ class SourcedTrack extends BasicSourcedTrack {
SpotubeAudioSourceContainerPreset preset, SpotubeAudioSourceContainerPreset preset,
int qualityIndex, int qualityIndex,
) { ) {
if (sources.isEmpty) return null;
final quality = preset.qualities[qualityIndex]; final quality = preset.qualities[qualityIndex];
final exactMatch = sources.firstWhereOrNull( final exactMatch = sources.firstWhereOrNull(
@ -326,45 +328,24 @@ class SourcedTrack extends BasicSourcedTrack {
return exactMatch; return exactMatch;
} }
// Find the closest to preset // Find the preset with closest quality to the supplied quality
SpotubeAudioSourceStreamObject? closest; return sources.where((source) {
for (final source in sources) { return source.container == preset.name;
if (source.container != preset.name) continue; }).reduce((prev, curr) {
if (quality is SpotubeAudioLosslessContainerQuality) {
if (quality case SpotubeAudioLosslessContainerQuality()) { final prevDiff = ((prev.sampleRate ?? 0) - quality.sampleRate).abs() +
final sourceBps = (source.bitDepth ?? 0) * (source.sampleRate ?? 0); ((prev.bitDepth ?? 0) - quality.bitDepth).abs();
final qualityBps = quality.bitDepth * quality.sampleRate; final currDiff = ((curr.sampleRate ?? 0) - quality.sampleRate).abs() +
final closestBps = ((curr.bitDepth ?? 0) - quality.bitDepth).abs();
(closest?.bitDepth ?? 0) * (closest?.sampleRate ?? 0); return currDiff < prevDiff ? curr : prev;
if (sourceBps == qualityBps) {
closest = source;
break;
}
final closestDiff = (closestBps - qualityBps).abs();
final sourceDiff = (sourceBps - qualityBps).abs();
if (sourceDiff < closestDiff) {
closest = source;
}
} else { } else {
final presetBitrate = final prevDiff = ((prev.bitrate ?? 0) -
(preset as SpotubeAudioLossyContainerQuality).bitrate; (quality as SpotubeAudioLossyContainerQuality).bitrate)
if (presetBitrate == source.bitrate) { .abs();
closest = source; final currDiff = ((curr.bitrate ?? 0) - quality.bitrate).abs();
break; return currDiff < prevDiff ? curr : prev;
}
final closestDiff = (closest?.bitrate ?? 0) - presetBitrate;
final sourceDiff = (source.bitrate ?? 0) - presetBitrate;
if (sourceDiff < closestDiff) {
closest = source;
}
} }
} });
return closest;
} }
String? getUrlOfQuality( String? getUrlOfQuality(