Вот со звуком надо бы поработать....

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Вот со звуком надо бы поработать....

Сообщение kotompazb » 08.09.2015 20:00:29

McLion писал(а):Не много подробнее проект описать можешь?

Топикстартеру, думаю, уже не важно. 8 лет уже прошло.
А вот для меня вопрос актуален. Подробности вот:
Целевая ОС: Win XP и старше. Кроссплатформенность в этом конкретном случае мне не важна, так как речь идет всего лишь об окошке "About", то есть функциональность всего проекта не затрагивается. Хочу при открытии формы запускать ЗАЦИКЛЕННОЕ проигрывание midi-файлика. При закрытии останавливать. Только и всего.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: Вот со звуком надо бы поработать....

Сообщение Little_Roo » 08.09.2015 21:37:06

Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 638
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Вот со звуком надо бы поработать....

Сообщение kotompazb » 08.09.2015 22:48:28

Little_Roo писал(а):bass ?
www.un4seen.com

Спасибо. Полезная библиотека.
Только очень не хочется тащить dll-ки только ради музыки в окошке "about". Обойдусь, в общем ,без зацикливания.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: Вот со звуком надо бы поработать....

Сообщение SAK » 16.09.2015 13:59:33

kotompazb писал(а):Здрасьте.
а вот так:
MCISendString(PChar('play ' + FileName+ 'repeat'), nil, 0, 0);
ни в какую! И, я так понял, так у всех.

А разве не нужно отделить имя файла от параметра пробелом?
MCISendString(PChar('play ' + FileName+ ' repeat'), nil, 0, 0);
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Вот со звуком надо бы поработать....

Сообщение kotompazb » 16.09.2015 14:18:49

SAK писал(а):А разве не нужно отделить имя файла от параметра пробелом?
MCISendString(PChar('play ' + FileName+ ' repeat'), nil, 0, 0);

Конечно. Это я просто здесь так написал случайно. Однако, проблему это не решает. Конечно, пробел должен быть, но это просто очепятка, а так хоть с пробелом, хоть без - тишина.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: Вот со звуком надо бы поработать....

Сообщение Снег Север » 17.09.2015 07:17:14

Если речь только о винде, можно попробовать использовать стандартный Windows Media Player, либо запуская его, как внешнее приложение:
http://wiki.freepascal.org/Multimedia_Programming/ru

либо подключив через Ole:
Код: Выделить всё
uses comobj;

var player: olevariant;

procedure TForm1.Button1Click(Sender: TObject);
begin
player:=CreateOleObject('Wmplayer.OCX.7');
player.url:=olevariant(UTF8Decode('G:/Alphaville - Big in Japan.mp3'));
player.controls.play;
end;

http://forum.lazarus.freepascal.org/ind ... ic=19699.0
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: Вот со звуком надо бы поработать....

Сообщение Vadim » 17.09.2015 13:41:56

kotompazb
А если функцию PlaySound() попробовать? У ней во флагах есть зацикливание...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Вот со звуком надо бы поработать....

Сообщение kotompazb » 17.09.2015 13:48:27

Vadim писал(а):А если функцию PlaySound() попробовать? У ней во флагах есть зацикливание...

Вот только не играет она миди:(
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: Вот со звуком надо бы поработать....

Сообщение SAK » 21.09.2015 10:21:05

У mciSendString есть параметр notify при указании которого при окончании воспроизведения указанному окну будет передаваться сообщение
MM_MCINOTIFY

Пример http://www.codeproject.com/Articles/172 ... edia-files
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Вот со звуком надо бы поработать....

Сообщение kotompazb » 21.09.2015 21:58:16

SAK писал(а):У mciSendString есть параметр notify при указании которого при окончании воспроизведения указанному окну будет передаваться сообщение
MM_MCINOTIFY

Что-то не выходит каменный цветок...
ЧЯДНТ?
Код: Выделить всё
procedure MMMciMotify(var Msg: TMessage); message MM_MCINOTIFY;

Код: Выделить всё
procedure TFormAbout.MMMciMotify(var Msg: TMessage);
begin
  if Msg.msg=MM_MCINOTIFY then begin
    //mciSendString('stop mySound', nil, 0, 0);
    mciSendString('play mySound notify' , nil, 0, FormAbout.Handle);
  end;
end;

Запускаю так же.
Код: Выделить всё
mciSendString('play mySound notify' , nil, 0, FormAbout.Handle);

Играет 1 раз по честному, но на обработчик сообщения даже не переходит.

К слову: с repeat не играла совсем.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: Вот со звуком надо бы поработать....

Сообщение SAK » 22.09.2015 17:12:19

http://forum.lazarus.freepascal.org/ind ... ic=24865.0

Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, messages, mmsystem, LMessages, windows;

type

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
   end;

var
  Form1: TForm1;
  PrevWndProc: WNDPROC;

implementation

function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam):LRESULT; stdcall;
begin
  if (uMsg = MM_MCINOTIFY) then
    if wParam = MCI_NOTIFY_SUCCESSFUL then
       mciSendString(PChar('play mmm from 0 notify'), nil, 0, Form1.Handle);

  result:=CallWindowProc(PrevWndProc,Ahwnd, uMsg, WParam, LParam);
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var s: array[0..511] of char;
begin
  PrevWndProc:=Windows.WNDPROC(SetWindowLong(Self.Handle,GWL_WNDPROC,PtrInt(@WndCallback)));
  mciGetErrorStringA(mciSendString('OPEN C:\WINDOWS\Media\tada.wav ALIAS mmm notify' , nil, 0, Handle), s, SizeOf(s));
  Text:=AnsiToUtf8(s)
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  mciSendString('close mmm' , nil, 0, 0)
end;

{$R *.lfm}

end.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Вот со звуком надо бы поработать....

Сообщение kotompazb » 22.09.2015 20:47:59

SAK, спасибо огромное! Оно поет!
Только надо было перенести в FormShow, а то петь рановато начинало.
А как убрать сообщение с заголовка формы теперь?:)
Изображение
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: Вот со звуком надо бы поработать....

Сообщение SAK » 22.09.2015 22:05:17

kotompazb писал(а):А как убрать сообщение с заголовка формы теперь?:)

Ну так:
mciGetErrorStringA - получить текст сообщения об ошибке по номеру ошибки,
Text:=AnsiToUtf8(s) - вывести текст в заголовок окна - это было сделано для диагностики ошибок.
А что бы петь рано не начинало нужно убрать автосоздание формы в проекте и создавать её только при необходимости перед показом.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Вот со звуком надо бы поработать....

Сообщение kotompazb » 22.09.2015 22:37:14

SAK писал(а):А что бы петь рано не начинало нужно убрать автосоздание формы в проекте и создавать её только при необходимости перед показом.

Да. Так наверное правильнее.
SAK писал(а):Text:=AnsiToUtf8(s) - вывести текст в заголовок окна - это было сделано для диагностики ошибок.

:D Что-то я даже не заметил сию строчку.
Спасибо.
Вопрос закрыт.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: Вот со звуком надо бы поработать....

Сообщение kotompazb » 15.02.2019 15:03:28

И вопрос снова открыт! :(
Код: Выделить всё
var
  Form1: TForm1;
  PrevWndProc: WNDPROC;

ругается тут:
Код: Выделить всё
PrevWndProc:=Windows.WNDPROC(SetWindowLong(Self.Handle,GWL_WNDPROC,PtrInt(@WndCallback)));

говорит мне:
formaboutpas.pas(144,16) Error: Illegal type conversion: "LongInt" to "<procedure variable type of function(QWord;LongWord;Int64;Int64):Int64;StdCall>"

Видимо, почаще надо обновлять Lazarus и врубаться, что изменилось...
Прошу помощи!
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: S_Gur, Yandex [Bot] и гости: 42

Рейтинг@Mail.ru