Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Воспроизвести звук 
V
    Опции темы
Scooter
Дата 3.6.2010, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.10.2007

Репутация: нет
Всего: 1



Привет Ребят! Вот такая проблема возникла: Нужно воспроизвести звук не через TMediaPlayer... В ассинхронном режиме чтобы сразу передавалось управление форме после начала воспроизведения и еще чтобы срабатывало в конце событие notify и можно было после того как закончиться воспроизводиться файл подставить другой...

Вот нашёл функцию и пример как с ней работать... Но она выдает ошибку в этой строчке,

Код

SendMCICommand('play "D:\Wav\CityMiddleLargeBed.wav" notify');


что мол notify нельзя использовать для автоматически открываемых устройств... и все тут... И как же решить тогда проблему? Помогите пожалуйста!

Код

procedure SendMCICommand(Cmd: string);
var
  RetVal: Integer;
  ErrMsg: array[0..254] of char;
begin
  RetVal := mciSendString(PChar(Cmd), nil, 0, Form1.Handle);
  if RetVal <> 0 then
  begin
    {get message for returned value}
    mciGetErrorString(RetVal, ErrMsg, 255);
    MessageDlg(StrPas(ErrMsg), mtError, [mbOK], 0);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMCICommand('open waveaudio shareable');
SendMCICommand('play "D:\Wav\CityMiddleLargeBed.wav" notify');
SendMCICommand('close waveaudio');
end;




Это сообщение отредактировал(а) Scooter - 4.6.2010, 05:36
PM MAIL   Вверх
Bitter
Дата 3.6.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 6
Всего: 27



На сколько я знаю, медиаплеер работает в таком режиме, и у него есть метод onNotify.
PM MAIL ICQ Skype   Вверх
Scooter
Дата 3.6.2010, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.10.2007

Репутация: нет
Всего: 1



Да работает, но... 
Цитата
Нужно воспроизвести звук не через TMediaPlayer...
 

Это сообщение отредактировал(а) Scooter - 3.6.2010, 11:39
PM MAIL   Вверх
AntonN
Дата 3.6.2010, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



внешняя dll пойдет? bass.dll например


--------------------
user posted image
PM MAIL WWW   Вверх
Scooter
Дата 3.6.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.10.2007

Репутация: нет
Всего: 1



ДА я вот заюзал как раз bass.dll, вроде подходит только пока не могу разобраться как обработчик сделать чтобы после воспроизведения начать новый файл воспроизводить...

вот пока что получилось...

Код

var
  Form1: TForm1;
  Channel:HStream;

procedure TForm1.Button1Click(Sender: TObject);
begin
BasicPlayerPlayFile('D:\wav\CityMiddleLargeBed.wav');
//SendMCICommand('open waveaudio shareable');
//SendMCICommand('play "D:\Êëèïû\CityMiddleLargeBed.wav" wait');
//SendMCICommand('close waveaudio');
end;

Procedure TForm1.BasicPlayerPlayFile(const FileName: string);
Var
FFileName:PChar;
Begin
IF Not FileExists(FileName) Then Exit;
FFileName:=PChar(FileName);


if Channel <> 0 Then
   Begin
   Bass_ChannelStop(Channel);
   Bass_StreamFree(Channel);
   Channel:=0;
   End;

Channel:=Bass_StreamCreateFile(False,FFileName,0,0,0);

if Channel = 0 Then Exit; //Îøèáêà çàãðóçêè ôàéëà

if not (Bass_ChannelPlay(Channel,False)) Then Exit; //Îøèáêà âîñïðîèçâåäåíèÿ ôàéëà...
End;

procedure TForm1.FormCreate(Sender: TObject);
Begin
IF not Bass_Init(-1,44100,0,handle,nil) Then Halt;
End;


Это сообщение отредактировал(а) Scooter - 3.6.2010, 13:01
PM MAIL   Вверх
Mikel
Дата 3.6.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Репутация: 1
Всего: 2



Тогда уж MMSystem а из него PlaySound, если не ошибаюсь, там можно в очередь выстроить звуки. Или не в асинхронном режиме, вызывать из отдельного потока.


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
Scooter
Дата 3.6.2010, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.10.2007

Репутация: нет
Всего: 1



А че неужели в bass.dll нет обработчика типа onNotify как в TMediaPlayer... Он меня всем устраивает только вот мне нужно знать обязательно когда один трек закончиться чтобы воспроизвести другой или вообще прекратить воспроизведение...
PM MAIL   Вверх
Scooter
Дата 4.6.2010, 05:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.10.2007

Репутация: нет
Всего: 1



Так как все таки обработчик в Bass.dll написать типа OnNotify в TMediaPlayer? может кто-нибудь знает?
PM MAIL   Вверх
AntonN
Дата 4.6.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



У bass есть BASS_ChannelSetSync(), которая может срабатывать при окончании проигрывания (только не забудь ее потом удалять - BASS_ChannelRemoveSync())

Добавлено через 4 минуты и 3 секунды
что то типа:

Код

procedure LoopSyncProc_pos(handle: HSYNC; channel, data: DWORD; user: Pointer); stdcall;
begin
   BASS_ChannelRemoveSync(channel, Handle);
   if(user<>nil) then begin
      //
   end;
end;



var chan:HSTREAM;
    lsync:HSYNC;
begin
chan:=BASS_StreamCreateFile(FALSE,pchar(filename),0,0,0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
lsync:=BASS_ChannelSetSync(chan,BASS_SYNC_END,0,LoopSyncProc_pos, Pointer(self) );


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


--------------------
user posted image
PM MAIL WWW   Вверх
Scooter
Дата 5.6.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.10.2007

Репутация: нет
Всего: 1



Спасибо Вам огромное!!! Проблема решена  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0942 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.