Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Время воспроизведения WMA потока в BASS


Автор: Maks1509 8.12.2009, 12:42
Всем привет. Подскажите как узнать время воспроизведения WMA потока в BASS. Для MP* потоков использую такую функцию:

Код

function BassFunc_GetPlayingTime(stream: HSTREAM): DWORD;
var
  iPos: Int64;
  fPos: FLOAT;
begin
  iPos := BASS_ChannelGetPosition(stream, BASS_POS_BYTE);
  if (iPos <= 0) then
    Result := 0
  else
    begin
      fPos := BASS_ChannelBytes2Seconds(stream, iPos);
      Result := Round(1000 * fPos);
    end;
end;


Потом все это дело используется в функции для удобочитаемости:

Код

function FormatTimeW(GetTickTime: DWORD): WideString;
begin
  GetTickTime := GetTickTime div 1000; // Millisec to Seconds
  Result := FormatW('%.2d', [GetTickTime mod 60]);
  GetTickTime := GetTickTime div 60; // Seconds to Minutes
  Result := FormatW('%.2d:%s', [GetTickTime mod 60, Result]);
  GetTickTime := GetTickTime div 60; // Minutes to Hours
  Result := FormatW('%.2d:%s', [GetTickTime mod 24, Result]);
end;


Хорошо тем что если происходит прерывание потока (ну например плохое соединение/загрузка ети/еще что-нибудь), то мы точно знаем какая позиция у "файла" и покажем время вопроизведения - не надо заморачиваться всяким таймером и следить за активностью потока вслучае его остановки.
Вслучае BASS_ChannelGetPosition с WMA возвращается -1. как сказано из документации. По форуму там ничего не нашел толкового.

Автор: kuzyara 8.12.2009, 18:32
хм... присоединяюсь!
я какраз такое же делать буду

Автор: Maks1509 9.12.2009, 12:03
Хм, как оказалось все нормально оказывается, просто у меня в отдельном потоке проверялся HSTREAM и если проверять через (BASS_ChannelIsActive(...) = BASS_ACTIVE_PLAYING) WMA поток, почему-то функция некорректно отрабатывает. Пришлось проверять на неравенство нулю.

Вот вариант получше.

Код

function BassUtils_GetPlayingTime(stream: HSTREAM): DWORD;
var
  pos: int64;
  sec: FLOAT;
begin
  Result := 0;
  pos := BASS_ChannelGetPosition(stream, BASS_POS_BYTE);
  if (pos < 0) then
    pos := 0;
  sec := BASS_ChannelBytes2Seconds(stream, pos);
  Result := Round(1000 * sec);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)