-1

我是菜鸟,所以请不要以为我知道很多。如果我使用了不正确的术语,请随时告诉我。

我在 SAM 广播器、无线电自动化软件的 PAL 脚本(基于 Pascal / Delphi)中有一个函数。

该函数返回与音乐文件相关的数据库记录中提示点 1 的时间(以毫秒为单位)。

我希望在我的脚本主体中调用这个函数的输出,因为你可能是一个变量。但它需要表示为 hh:mm:ss 时间戳。

这是函数,它的输出可能为 20000,持续 20 秒。

var CP : Integer = 0;

function ExtractCP(Song : TSongInfo):Integer;
var
P : Integer;
XFade : String;
begin
Result := -1;
XFade := Trim(Song['xfade']);

WriteLn('Decoding XFade string');
WriteLn('XFade: '+XFade);

if XFade = '' then
  Result := -1
else
  begin
   P := Pos('ct0=',XFade);  {Where 0 is the Custom Cue Point Number}
   if (P > 0) then
    begin
     Delete(XFade,1,P+2);
     P := Pos('&',XFade);
     if (P>0) then
      Delete(XFade,P,Length(XFade));

     Result := StrToIntDef(XFade,-1);

     WriteLn('CP time detected: '+XFade);
    end;
  end;
end;

这是实现组件。

   while (Song['songtype']='S') and (not Skip) do
        begin   
         VAR DT : DateTime;
         VAR frac : Float;
         VAR hours, minutes, seconds, milliseconds : Integer;
         hours := 24;
         minutes := 60;
         seconds := 60;
         milliseconds := 1000;

     // 1 millisecond as fractional part of a day
     frac := 1.0 / hours / minutes / seconds / milliseconds;
     frac := frac * cp;

     dt := Now + DateTime (frac); {Wait for Cue Point 0}
     WriteLn(DateTimeToStr(dt));
     PAL.WaitForTime(DT);
     Skip := True;
    end;

我想我的问题很简单。

未导入计算变量“cp”,如何正确调用该行中的函数结果...

 frac := frac * cp;

我在这里得到了帮助(对于完整的背景,包括时间戳计算方法和整个脚本)......

http://support.spacialaudio.com/forums/viewtopic.php?f=23&t=40795&start=15

4

1 回答 1

4

假设 XFade 包含像 'ABC ct0=1234&' 这样的字符串,
Delete(XFade,1,P+2);将提供 '=1234&'

P := Pos('&',XFade);
     if (P>0) then
      Delete(XFade,P,Length(XFade));

将提供无法转换为整数的 '=1234'
所以至少你必须更改Delete(XFade,1,P+2);Delete(XFade,1,P+3);

dt 的生成可以缩短为

{ if not defined
Const
  MSecsPerDay= 24*60*60*1000;
}
cp := ExtractCP(Song);
if cp>-1 then
   begin
     dt := Now + CP / MSecsPerDay;
     .....
   end;
于 2013-04-22T13:15:39.627 回答