Проблема с запуском виндового муз. плеера в Ubuntu под Wine

аватар: Kastor
Звание: Советник
Сообщений: 789

Написал я своеобразный музыкальный проигрыватель под винду на Делфи. Для воспроизведения звука использовал компонент TMediaPlayer. Под виндой все работает отлично.
Теперь возникла необзодимость запускать это же приложение на Ubunte под Wine. Приложение то запускается, но при воспроизведении музыки из плейлиста происходят лаги: песня начинает играть и сразу замолкает, и тут же начинает играть рандомная песня из плейлиста и в таком духе.

В чем может быть проблема? Может это Wine не до конца правильно эмулирует работу винды при воспроизведении аудиофайлов?

__________________

Скажите мне док, считающий себя единственным здравомыслящим человеком сумасшедший?
Если да, возможно я псих.
]]>http://kastordriver.livejournal.com/]]>

аватар: Va-Bank
Звание: Гуру
Сообщений: 5573

Мне кажется TMediaPlayer это просто обертка для API в винде. Wine все таки не винда, может чего-то не хватает. А может вообще проблема в кодеках. Поставть на убунту Lazarus и запрограммируй себе плеер под линуху )))

__________________


аватар: raxp
Звание: Советник
Сообщений: 634

...TMediaPlayer испольузет MCI для работы, т.е. он сам ничего не делает на низком уровне. Таки проблема в некоректной работе-эмуляции MCI.

P.S.: пробовал ли просто mciSendString() (TMediaPlayer его и использует) для работы? И да, проблема может быть в кодеках.

Вот простенький плеер на том же принципе:

program mciplayer;
 
uses
  Windows,Messages,CommDlg,MMSystem;
 
const
  ClassName = 'MCID';
 
var
  mywnd: hWnd;
  msg: TMsg;
  fname:string;
  wx,wy,ww,wh:integer;
  flag:integer;
  sbReturn: array [1..64] of char; //для возвращаемых значений
  com: pchar; //посылаемая команда
  ofn: OpenFileName;
 
procedure OpenDialog();
 var
     szFile,szFileTitle:Array[0..127] of char;
 begin
  szFile:='';
  szFileTitle:='';
  ZeroMemory(@ofn, sizeof(ofn));
  ofn.lStructSize := sizeof(ofn);
  ofn.lpstrFile := szFile;
  ofn.lpstrFileTitle := szFileTitle;
  ofn.nMaxFile := sizeof(szFile);
  ofn.nMaxFileTitle := sizeof(szFileTitle);
  ofn.lpstrFilter:= 'ALL'+#0+'*.*'#0#0;
  ofn.nFilterIndex := 1;
  ofn.lpstrInitialDir := nil;
  ofn.Flags := OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST;
  if(GetOpenFileName(ofn)) then begin
  flag:=1; fname:=ofn.lpstrFile;
  end else flag:=0;
end;
 
procedure Open(szBf:pchar);
 var szBfr,szBfr1:string;
 begin
 szBfr:=szBf;
 szBfr1:='open '+szBfr+' type mpegaudio alias myFile';
 mciSendString(Pchar(szBfr1), @sbReturn, 64, 0);
 end;
 
function MyWndProc(wnd: hWnd; msg, wParam,
  lParam: longint): longint; stdcall;
 begin  Case msg of
 
  WM_COMMAND:
   begin
    if(LOWORD(wParam)=1001) then
     begin
      OpenDialog();
       if flag=1 then begin
        Open(Pchar(fname));
        com := 'resume myFile wait';
        mciSendString(com, @sbReturn, 64, 0);
       end;
     end;
     result := 0;
   end;
 
  WM_DESTROY:
   begin
    PostQuitMessage(0);result := 0;
   end;
   else Result := DefWindowProc(wnd, msg, WParam, LParam);
  end;
end;
 
function CreateMyWnd: hWnd;
 var
  wc: WndClass;
 begin
  wc.style := 0;
  wc.lpfnWndProc := @MyWndProc;
  wc.cbClsExtra := 0;
  wc.cbWndExtra := 0;
  wc.hInstance := hInstance;
  wc.hIcon := 0;
  wc.hCursor := 0;
  wc.hbrBackground := COLOR_WINDOW;
  wc.lpszMenuName := nil;
  wc.lpszClassName := ClassName;
  if RegisterClass(wc) = 0 then halt(0);
  result:= CreateWindowEx(WS_EX_APPWINDOW, ClassName,
    'MCI-Player', WS_OVERLAPPEDWINDOW, wx, wy, ww, wh, 0, 0, hInstance, nil);
  if result = 0 then halt(0);
 end;
 
begin
  wx:=200;wy:=50;ww:=200;wh:=100;
  mywnd:=CreateMyWnd;
 
  CreateWindow('button','play',WS_CHILD or WS_VISIBLE or
    BS_PUSHBUTTON,40,20,100,30,mywnd,HMENU(1001), hInstance, nil);
  ShowWindow(mywnd,SW_SHOWNORMAL);
 
  while (GetMessage(msg, 0, 0, 0)) do begin
    TranslateMessage(msg);
    DispatchMessage(msg)
  end;
 
end.