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

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

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

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

Сообщение kotompazb »

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

Топикстартеру, думаю, уже не важно. 8 лет уже прошло.
А вот для меня вопрос актуален. Подробности вот:
Целевая ОС: Win XP и старше. Кроссплатформенность в этом конкретном случае мне не важна, так как речь идет всего лишь об окошке "About", то есть функциональность всего проекта не затрагивается. Хочу при открытии формы запускать ЗАЦИКЛЕННОЕ проигрывание midi-файлика. При закрытии останавливать. Только и всего.
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

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

Сообщение kotompazb »

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

Спасибо. Полезная библиотека.
Только очень не хочется тащить dll-ки только ради музыки в окошке "about". Обойдусь, в общем ,без зацикливания.
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

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

А разве не нужно отделить имя файла от параметра пробелом?
MCISendString(PChar('play ' + FileName+ ' repeat'), nil, 0, 0);
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

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

Конечно. Это я просто здесь так написал случайно. Однако, проблему это не решает. Конечно, пробел должен быть, но это просто очепятка, а так хоть с пробелом, хоть без - тишина.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Если речь только о винде, можно попробовать использовать стандартный 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
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

kotompazb
А если функцию PlaySound() попробовать? У ней во флагах есть зацикливание...
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

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

Вот только не играет она миди:(
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

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

Пример http://www.codeproject.com/Articles/172 ... edia-files
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

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 не играла совсем.
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

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.
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

SAK, спасибо огромное! Оно поет!
Только надо было перенести в FormShow, а то петь рановато начинало.
А как убрать сообщение с заголовка формы теперь?:)
Изображение
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

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

Ну так:
mciGetErrorStringA - получить текст сообщения об ошибке по номеру ошибки,
Text:=AnsiToUtf8(s) - вывести текст в заголовок окна - это было сделано для диагностики ошибок.
А что бы петь рано не начинало нужно убрать автосоздание формы в проекте и создавать её только при необходимости перед показом.
Аватара пользователя
kotompazb
постоялец
Сообщения: 156
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Сообщение kotompazb »

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

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

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

Сообщение kotompazb »

И вопрос снова открыт! :(

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

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 и врубаться, что изменилось...
Прошу помощи!
Ответить