Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions src/base/USong.pas
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ TSong = class
destructor Destroy; override;
function LoadSong(DuetChange: boolean): boolean;
function Analyse(const ReadCustomTags: Boolean = false; DuetChange: boolean = false; RapToFreestyle: boolean = false; OutOfBoundsToFreestyle: boolean = false; AudioLength: real = 0; ForceLoadNotes: boolean = false): boolean;
function GetPreviewStart(AudioLength: real): real;
procedure SetMedleyMode();
procedure Clear();
function MD5SongFile(SongFileR: TTextFileStream): string;
Expand Down Expand Up @@ -1504,6 +1505,46 @@ function TSong.GetErrorLineNo: integer;
Result := -1;
end;

function TSong.GetPreviewStart(AudioLength: real): real;
var
EffectiveAudioStart: real;
EffectiveAudioEnd: real;
EffectiveAudioLength: real;
PreviewOffset: real;
begin
if (AudioLength <= 0.0) then
begin
Result := 0.0;
Exit;
end;

// PreviewStart is an explicit absolute position in the audio file.
if ((PreviewStart > 0.0) or HasPreview) and InRange(PreviewStart, 0.0, AudioLength) then
begin
Result := PreviewStart;
Exit;
end;

EffectiveAudioStart := EnsureRange(Start, 0.0, AudioLength);
if (Finish > 0) then
EffectiveAudioEnd := EnsureRange(Finish / 1000.0, 0.0, AudioLength)
else
EffectiveAudioEnd := AudioLength;

if (EffectiveAudioEnd <= EffectiveAudioStart) then
begin
EffectiveAudioStart := 0.0;
EffectiveAudioEnd := AudioLength;
end;

EffectiveAudioLength := EffectiveAudioEnd - EffectiveAudioStart;
PreviewOffset := EffectiveAudioLength / 4.0;
if (PreviewOffset > 120.0) then
PreviewOffset := 60.0;

Result := EffectiveAudioStart + PreviewOffset;
end;

function TSong.GetMD5: string;
var
SongFile: TMemTextFileStream;
Expand Down
5 changes: 1 addition & 4 deletions src/screens/UScreenScore.pas
Original file line number Diff line number Diff line change
Expand Up @@ -1805,10 +1805,7 @@ procedure TScreenSCore.StartPreview;

if AudioPlayback.Open(CatSongs.Song[select].Path.Append(CatSongs.Song[select].Audio),nil) then
begin
if (CatSongs.Song[select].PreviewStart > 0) then
AudioPlayback.Position := CatSongs.Song[select].PreviewStart
else
AudioPlayback.Position := (AudioPlayback.Length / 4);
AudioPlayback.Position := CatSongs.Song[select].GetPreviewStart(AudioPlayback.Length);

// set preview volume
PreviewVolume := EnsureRange(Ini.PreviewVolume, 0, 100) / 100;
Expand Down
10 changes: 1 addition & 9 deletions src/screens/UScreenSong.pas
Original file line number Diff line number Diff line change
Expand Up @@ -3640,15 +3640,7 @@ procedure TScreenSong.StartMusicPreview();
begin
PreviewOpened := Interaction;

// preview start is either calculated (by finding the chorus) or pre-set, use it
if ((Song.PreviewStart > 0.0) or Song.HasPreview) and InRange(Song.PreviewStart, 0.0, AudioPlayback.Length) then
PreviewPos := Song.PreviewStart
else
begin // otherwise, fallback to simple preview calculation
PreviewPos := AudioPlayback.Length / 4;
// fix for invalid music file lengths
if (PreviewPos > 120.0) then PreviewPos := 60.0;
end;
PreviewPos := Song.GetPreviewStart(AudioPlayback.Length);

AudioPlayback.Position := PreviewPos;

Expand Down
Loading