\r
for (i=0;(i<numpin);i++) {\r
pins[i]=(AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));\r
- if (parent->GetMediaType(curpos+i,pins[i])!=S_OK) return S_FALSE;\r
- curpos++;\r
+ if (parent->GetMediaType(curpos+i,pins[i])!=S_OK) {\r
+ CoTaskMemFree(pins[i]);\r
+ pins[i]=NULL;\r
+ return S_FALSE;\r
+ } curpos++;\r
if (fetched!=NULL) (*fetched)++;\r
}\r
return S_OK;\r
LeaveCriticalSection(&m_pFilter->filterlock);\r
} else {\r
LeaveCriticalSection(&m_pFilter->filterlock);\r
- CoTaskMemFree(mtype->pbFormat);\r
+ if (mtype->pbFormat!=NULL) CoTaskMemFree(mtype->pbFormat);\r
pinempf->Release();\r
return VFW_E_TYPE_NOT_ACCEPTED;\r
}\r
\r
} else {\r
LeaveCriticalSection(&m_pFilter->filterlock);\r
- CoTaskMemFree(mtype->pbFormat);\r
+ if (mtype->pbFormat!=NULL) CoTaskMemFree(mtype->pbFormat);\r
return VFW_E_TYPE_NOT_ACCEPTED;\r
}\r
CoTaskMemFree(mtype->pbFormat);\r
pinempf->AddRef();\r
while (emt->Next(1,&emtype,&fetched)==S_OK) {\r
if (CheckMediaType(emtype)==S_OK){\r
+/* PIN_INFO pini;\r
+ pinempf->QueryPinInfo(&pini);\r
+ if (pini.pFilter!=NULL) {\r
+ FILTER_INFO filti;\r
+ pini.pFilter->QueryFilterInfo(&filti);\r
+\r
+ if (filti.pGraph!=NULL) filti.pGraph->Release();\r
+ char buffer[MAX_FILTER_NAME*2];\r
+ wcstombs(buffer,filti.achName,MAX_FILTER_NAME*2);\r
+ MessageBox(0,buffer,"Filter",0);\r
+ pini.pFilter->Release();\r
+ }*/\r
+\r
if (pinempf->ReceiveConnection((IPin*)this,emtype)==S_OK) {\r
connected=pinempf;\r
CopyMType(&medtype,emtype);\r
- CoTaskMemFree(emtype->pbFormat);\r
+ if (emtype->pbFormat!=NULL) CoTaskMemFree(emtype->pbFormat);\r
+ \r
CoTaskMemFree(emtype);\r
gotmt=true;\r
break;\r
}\r
\r
}\r
- CoTaskMemFree(emtype->pbFormat);\r
+ if (emtype->pbFormat!=NULL) CoTaskMemFree(emtype->pbFormat);\r
CoTaskMemFree(emtype);\r
}\r
emt->Release();\r
if (pinempf->ReceiveConnection((IPin*)this,emtype)==S_OK) {\r
connected=pinempf;\r
CopyMType(&medtype,emtype);\r
- CoTaskMemFree(emtype->pbFormat);\r
+ if (emtype->pbFormat!=NULL) CoTaskMemFree(emtype->pbFormat);\r
CoTaskMemFree(emtype);\r
gotmt=true;\r
break;\r
}\r
\r
}\r
- CoTaskMemFree(emtype->pbFormat);\r
+ if (emtype->pbFormat!=NULL) CoTaskMemFree(emtype->pbFormat);\r
CoTaskMemFree(emtype);\r
}\r
emt->Release();\r
CopyMType(mtype,&medtype);\r
return S_OK;\r
} else {\r
- ZeroMemory(mtype,sizeof(mtype));\r
+ ZeroMemory(mtype,sizeof(*mtype));\r
return VFW_E_NOT_CONNECTED;\r
}\r
}\r
wfe.wfx.nAvgBytesPerSec=32000;\r
wfe.wfx.nBlockAlign=768;\r
wfe.wfx.wFormatTag=WAVE_FORMAT_MPEG;\r
+ wfe.wfx.wBitsPerSample=0;\r
wfe.fwHeadLayer=2;\r
wfe.dwHeadBitrate=256000;\r
wfe.fwHeadMode=ACM_MPEG_STEREO;\r
wallpaperNTSC.jpg RCDATA other\wallpaperNTSC.jpg\r
wallpaperPAL.jpg RCDATA other\wallpaperPAL.jpg\r
\r
-\r
+VOMPMENU MENU\r
+BEGIN\r
+ POPUP "Dummy"\r
+ BEGIN\r
+ MENUITEM "&Play \t Shift+Ctrl+P", APPCOMMAND_MEDIA_PLAY\r
+ MENUITEM "Pause\t Ctrl+P", APPCOMMAND_MEDIA_PAUSE\r
+ MENUITEM "&Stop\tCtrl+S", APPCOMMAND_MEDIA_STOP\r
+ MENUITEM "Record\tCtrl+R", APPCOMMAND_MEDIA_RECORD\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "Rewind\t Shift+Ctrl+B", APPCOMMAND_MEDIA_REWIND\r
+ MENUITEM "Fast Forward\t Shift+Ctrl+F", APPCOMMAND_MEDIA_FAST_FORWARD\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "Skip Backward\tCtrl+B", APPCOMMAND_MEDIA_PREVIOUSTRACK\r
+ MENUITEM "Skip Forward\tCtrl+F", APPCOMMAND_MEDIA_NEXTTRACK\r
+ MENUITEM SEPARATOR\r
+ POPUP "&Menu"\r
+ BEGIN\r
+ MENUITEM "&OK\tEnter", VOMP_ENTER\r
+ MENUITEM "&Cancel\t Backspace", VOMP_CANCEL\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Up", VOMP_UP\r
+ MENUITEM "&Down", VOMP_DOWN\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Left", VOMP_LEFT\r
+ MENUITEM "&Right", VOMP_RIGHT\r
+ END\r
+ MENUITEM SEPARATOR\r
+ POPUP "Volume"\r
+ BEGIN\r
+ MENUITEM "Volume &Up\tF10", APPCOMMAND_VOLUME_UP\r
+ MENUITEM "Volume &Down\t F9", APPCOMMAND_VOLUME_DOWN\r
+ MENUITEM "Volume &Mute\tF8", APPCOMMAND_VOLUME_MUTE\r
+ END\r
+ MENUITEM SEPARATOR\r
+ POPUP "&Buttons"\r
+ BEGIN\r
+ MENUITEM "&Yellow", VOMP_YELLOW\r
+ MENUITEM "&Blue", VOMP_BLUE\r
+ MENUITEM "&Green", VOMP_GREEN\r
+ MENUITEM "&Red", VOMP_RED\r
+ END\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "Channel &Up\t Page Up", APPCOMMAND_MEDIA_CHANNEL_UP\r
+ MENUITEM "Channel &Down\t Page Down", APPCOMMAND_MEDIA_CHANNEL_DOWN\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Fullscreen\t Alt+Enter", VOMP_FULL_SCREEN\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Always on Top", VOMP_TOPMOST\r
+ END\r
+END\r
\r
\r
\r
Video* video;\r
Audio* audio;\r
bool wnd_fullscreen=false;\r
+bool wnd_topmost=false;\r
RECT wnd_fs_rect={20,20,768+20,576+20};\r
RECT wnd_fs_rect_client={0,0,768,576};\r
//OSVERSIONINFO windows_ver; //attempt to distigsh windows versions\r
bool remotefnc=false;\r
-\r
+HINSTANCE hinstance;\r
+bool cmenu=false;\r
\r
HMODULE user32dll;\r
typedef UINT (WINAPI *GETRAWINPUTDATAFNC) (HRAWINPUT,UINT,LPVOID,PUINT,UINT);\r
GETRAWINPUTDATAFNC dynGetRawInputData=NULL;\r
REGISTERRAWINPUTDEVICEFNC dynRegisterRawInputDevices=NULL;\r
\r
+DWORD lastmousemove;\r
\r
void MILLISLEEP(ULONG a)
{
#define ERROR_MSG(str) MessageBox(win_main,str,"Error!",MB_OK|MB_ICONWARNING)\r
INT WINAPI WinMain( HINSTANCE hinst , HINSTANCE previnst, LPSTR cmdline, int cmdshow)\r
{\r
+ hinstance=hinst;\r
//On Windows we have to init a window, we use DXUT\r
LoadRemoteFunctions();\r
if (!InitApp(hinst,cmdshow)) return false;\r
// Run main loop ---------------------------------------------------------------------------------------------------\r
\r
// Ok, all major device components and other bits are loaded and ready\r
- \r
+ lastmousemove=timeGetTime();\r
HANDLE commandthread;\r
commandthread= CreateThread(NULL, 0, commandthreadStart, NULL,0, \r
NULL);\r
|WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX);\r
SetWindowPos(win_main,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
\r
- SetWindowPos(win_main,HWND_TOP,wnd_fs_rect.left,wnd_fs_rect.top,\r
+ SetWindowPos(win_main,wnd_topmost?HWND_TOPMOST:HWND_TOP,wnd_fs_rect.left,wnd_fs_rect.top,\r
wnd_fs_rect.right-wnd_fs_rect.left,\r
wnd_fs_rect.bottom-wnd_fs_rect.top,\r
SWP_DRAWFRAME | SWP_FRAMECHANGED);\r
moninfo.cbSize=sizeof(moninfo);\r
wnd_fullscreen=true;\r
if (!GetMonitorInfo(monitor,&moninfo)) return ;\r
- SetWindowPos(win_main,HWND_TOP,moninfo.rcMonitor.left,moninfo.rcMonitor.top,\r
+ SetWindowPos(win_main,wnd_topmost?HWND_TOPMOST:HWND_TOP,moninfo.rcMonitor.left,moninfo.rcMonitor.top,\r
moninfo.rcMonitor.right,moninfo.rcMonitor.bottom,SWP_FRAMECHANGED);\r
\r
AdjustWindow();\r
\r
}\r
\r
+void ToggleTopmost() {\r
+ wnd_topmost=!wnd_topmost;\r
+ SetWindowPos(win_main,wnd_topmost?HWND_TOPMOST:HWND_NOTOPMOST,0,0,\r
+ 0,0,SWP_NOMOVE | SWP_NOSIZE);\r
+}\r
+\r
+void CursorUpdate() {\r
+ POINT cursorpos;\r
+ GetCursorPos(&cursorpos);\r
+ HWND asswind;\r
+ asswind=WindowFromPoint(cursorpos);\r
+ if (asswind!=win_main && asswind!=win) {\r
+ return ; //not our responsibility\r
+ }\r
+ if ((timeGetTime()-lastmousemove)<4000 || cmenu) {\r
+ SetCursor(LoadCursor(NULL,IDC_ARROW));\r
+ } else {\r
+ SetCursor(NULL);\r
+ }\r
+}\r
+\r
+bool ContextMenu(HWND wind,int x,int y) {\r
+ POINT p={x,y};\r
+ RECT clientrect;\r
+ ScreenToClient(wind,&p);\r
+ GetClientRect(wind,&clientrect);\r
+ if (!PtInRect(&clientrect,p)) return false;\r
+ ClientToScreen(wind,&p);\r
+ HMENU menu;\r
+ HMENU popup;\r
+ menu=LoadMenu(hinstance,MAKEINTRESOURCE(VOMPMENU));\r
+ popup=GetSubMenu(menu,0);\r
+ if (wnd_fullscreen) {\r
+ CheckMenuItem(popup,VOMP_FULL_SCREEN,MF_BYCOMMAND|MF_CHECKED);\r
+ } else {\r
+ CheckMenuItem(popup,VOMP_FULL_SCREEN,MF_BYCOMMAND|MF_UNCHECKED);\r
+ }\r
+ if (wnd_topmost) {\r
+ CheckMenuItem(popup,VOMP_TOPMOST,MF_BYCOMMAND|MF_CHECKED);\r
+ } else {\r
+ CheckMenuItem(popup,VOMP_TOPMOST,MF_BYCOMMAND|MF_UNCHECKED);\r
+ }\r
+ cmenu=true;\r
+ TrackPopupMenu(popup,TPM_RIGHTBUTTON|TPM_LEFTALIGN,x,y,0,wind, NULL);\r
+ cmenu=false;\r
+\r
+\r
+ DestroyMenu(menu);\r
+ return true;\r
+}\r
+\r
LONG FAR PASCAL WindowProc(HWND wind, UINT msg, WPARAM wparam, LPARAM lparam)\r
{\r
\r
ToggleFullscreen();\r
return 0;\r
}\r
+ if (LOWORD(wparam)==VOMP_TOPMOST) {\r
+ ToggleTopmost();\r
+ return 0;\r
+ }\r
if (((RemoteWin*)remote)->ReceiveButtonAP(LOWORD(wparam))){\r
return 0; //yes we process that message\r
} else {\r
break;\r
case WM_SETCURSOR:\r
if (((HANDLE)wparam)==win) {\r
- SetCursor(NULL);\r
+ CursorUpdate();\r
return 1;\r
} else {\r
return DefWindowProc(wind, msg, wparam, lparam);\r
return DefWindowProc(wind,msg,wparam, lparam);\r
}\r
break;\r
+ case WM_MOUSEMOVE:\r
+ lastmousemove=timeGetTime();\r
+ SetCursor(LoadCursor(NULL,IDC_ARROW));\r
+ SetTimer(wind,VOMP_CURSORUPDATE,4500,NULL);\r
+ return 0;\r
+ //return DefWindowProc(wind,msg,wparam, lparam);\r
+ break;\r
+ case WM_TIMER:\r
+ if (wparam==VOMP_CURSORUPDATE) {\r
+ CursorUpdate();\r
+ return 0;\r
+ }\r
+ return DefWindowProc(wind, msg, wparam, lparam);\r
+\r
+ break;\r
+ case WM_CONTEXTMENU:\r
+ if (!ContextMenu(wind,GET_X_LPARAM(lparam),GET_Y_LPARAM(lparam))) {\r
+ return DefWindowProc(wind, msg, wparam, lparam);\r
+ } else {\r
+ return 0;\r
+ }\r
+\r
default:\r
return DefWindowProc(wind, msg, wparam, lparam);\r
}\r
/* in order to handle letterboxing we use a child window */\r
WNDCLASS child_wcs;\r
child_wcs.style = CS_HREDRAW | CS_VREDRAW;\r
- child_wcs.lpfnWndProc = DefWindowProc;\r
+ child_wcs.lpfnWndProc = WindowProc;\r
child_wcs.cbClsExtra = 0;\r
child_wcs.cbWndExtra = sizeof(DWORD);\r
child_wcs.hInstance = hinst;\r