Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2012, 17:38   #1
Sahan911
 
Регистрация: 08.08.2011
Сообщений: 5
Сообщение mciSendString отловить момент остановки воспроизведения

Доброго времени суток!
Мне необходимо отловить событие остановки воспроизведения файла, открытого при помощи функции mciSendString. Пожалуйста, не надо говорить мне про комманду "Status Trek Mode", так как она лишь определяет состояние проигрывания, но не ловит события. Также не надо мне говорить про комманду "Wait", т.к. она передает управление потоку только после завершения воспроизведения.
Я пробовал создавать отдельный поток и вызывать в нём комманду с ожиданием:
Код:
type
  TSoundThread = class(TThread)
  private
    Name: String;
    Playing: PBoolean; 
  protected
    procedure Execute; override;
  end;

implementation

procedure Open;
begin
  if not Opened then 
    mciSendString(PChar('Open ' + FileName + ' Type ' + DeviceName +
         ' Alias ' + FName + ' Wait'), nil, 0, 0);
  Opened := True;
end;

procedure Play;
if not Played and Opened and (Mode = smPlay) then
    begin
      SoundThread := TSoundThread.Create(True);
      with SoundThread do
      begin;
        FreeOnTerminate := True;
        Priority := tpNormal;
        Name := FName;
        Played := True;
        Playing := @Played;
      end;
    end;
end;

procedure TSoundThread.Execute;
begin
  mciSendString(PChar('Play ' + Name + ' Wait'), nil, 0, 0);
  if Playing^ then
    Playing^ := False;
end;
Где:
FileName, FName, DeviceName: String - имя файла/ его псевдоним/ название устройства вывода
Opened, Played: Boolean - открыт или не открыт файл/ идет проигрывание или нет.

Но в другом потоке Mci не распознает открытого мною файла, как - будто я его не открывал, а также не реагирует на изменение скорости/громкости и других параметров.

Есть еще вариант, и он, поидее, должен работать, но мне кажется, что это слишком нерациональный метод поскольку слишком много запросов в единицу времени:

Код:
...

function GetMode: Boolean;
var
  Buf: array [1..8] of Char;
  Return: String[8];
begin
  Result := False;
  if Opened then
  begin
    mciSendString(PChar('Status ' + FName + ' ' + 'Mode' + ' Wait'), @Buf, 8, 0);
    Return := AnsiUpperCase(Trim(Buf));
    if Return = 'STOPPED' then
      Result := False;
    if Return = 'PLAYING' then
      Result := True;  
  end;
end;

procedure TimerOnTimer; //interval = 1;
begin
  if  not GetMode then
    SendMessage ... ;
end;
Это хороший метод, или кто-нибудь может предложить более рациональный подход? Заранее спасибо за ответы.

P.S может кто-нибудь знает как можно определить с помощью msiSendString открыт ли CD-ROM (не открыть или закрыть, а именно определить открыт-ли он) независимо от того, есть ли там диск или его там нет. И пожалуйста без ответов типа "Взгляни на CD - Rom "

Последний раз редактировалось Sahan911; 20.07.2012 в 17:53. Причина: ошибся
Sahan911 вне форума Ответить с цитированием
Старый 20.07.2012, 18:03   #2
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Про флаг notify, который отсылает в заданное (четвертым параметром mciSendString) окно уведомление MM_MCINOTIFY при завершении операции - можно напомнить?
volvo877 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
mciSendString(PChar(Cmd), nil, 0, 0); проблема с пробелами в пути к файлу ArtGrek Мультимедиа в Delphi 8 02.08.2016 15:54
mciSendString Alt Мультимедиа в Delphi 1 13.04.2014 10:00
Реализация остановки обработки 8day Помощь студентам 3 04.04.2012 19:14
mciSendString stdio Общие вопросы C/C++ 8 24.03.2012 20:19
mciSendString не открывает некоторые файлы Гром Общие вопросы C/C++ 10 28.12.2010 09:55