Проблема с запуском виндового муз. плеера в Ubuntu под Wine
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Написал я своеобразный музыкальный проигрыватель под винду на Делфи. Для воспроизведения звука использовал компонент TMediaPlayer. Под виндой все работает отлично.
Теперь возникла необзодимость запускать это же приложение на Ubunte под Wine. Приложение то запускается, но при воспроизведении музыки из плейлиста происходят лаги: песня начинает играть и сразу замолкает, и тут же начинает играть рандомная песня из плейлиста и в таком духе.
В чем может быть проблема? Может это Wine не до конца правильно эмулирует работу винды при воспроизведении аудиофайлов?
Мне кажется TMediaPlayer это просто обертка для API в винде. Wine все таки не винда, может чего-то не хватает. А может вообще проблема в кодеках. Поставть на убунту Lazarus и запрограммируй себе плеер под линуху )))
...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.




