]> git.saurik.com Git - wxWidgets.git/blame_incremental - contrib/src/mmedia/vidwin.cpp
Typos fixed and further clarification of the Python situation on Panther
[wxWidgets.git] / contrib / src / mmedia / vidwin.cpp
... / ...
CommitLineData
1// -----------------------------------------------------------------------------
2// Name: vidwin.h
3// Purpose: wxMMedia
4// Author: Guilhem Lavaux
5// Created: February 1998
6// Updated:
7// Copyright: (C) 1998, 1999, 2000 Guilhem Lavaux
8// License: wxWindows license
9// -----------------------------------------------------------------------------
10
11#ifdef __GNUG__
12#pragma implementation "vidwin.h"
13#endif
14
15#include "wx/wxprec.h"
16
17#ifndef WX_PRECOMP
18#include "wx/wx.h"
19#endif
20
21#if defined(__WINDOWS__) && !defined(__GNUWIN32__) && !defined(__WATCOMC__)
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
27#include "wx/stream.h"
28#include "wx/wfstream.h"
29
30#define WXMMEDIA_INTERNAL
31#include <windows.h>
32#include <mmsystem.h>
33#include <digitalv.h>
34#include "wx/mmedia/vidwin.h"
35
36#ifdef __BORLANDC__
37#pragma hdrstop
38#endif
39
40IMPLEMENT_DYNAMIC_CLASS(wxVideoWindows, wxVideoBaseDriver)
41
42wxVideoWindows::wxVideoWindows()
43{
44}
45
46wxVideoWindows::wxVideoWindows(wxInputStream& str)
47 : wxVideoBaseDriver(str)
48{
49 m_internal = new wxVIDWinternal;
50 m_remove_file = TRUE;
51 m_filename = wxGetTempFileName(_T("wxvid"));
52 m_paused = FALSE;
53 m_stopped = TRUE;
54 m_frameRate = 1.0;
55
56 wxFileOutputStream temp_file(m_filename);
57 temp_file << str;
58
59 OpenFile();
60}
61
62wxVideoWindows::wxVideoWindows(const wxString& filename)
63 : wxVideoBaseDriver(filename)
64{
65 m_internal = new wxVIDWinternal;
66 m_remove_file = FALSE;
67 m_filename = filename;
68 m_paused = FALSE;
69 m_stopped = TRUE;
70 m_frameRate = 1.0;
71 OpenFile();
72}
73
74wxVideoWindows::~wxVideoWindows(void)
75{
76 mciSendCommand(m_internal->m_dev_id, MCI_CLOSE, 0, 0);
77
78 if (m_internal)
79 delete m_internal;
80}
81
82void wxVideoWindows::OpenFile()
83{
84 MCI_DGV_OPEN_PARMS openStruct;
85 MCI_DGV_SET_PARMS setStruct;
86 MCI_STATUS_PARMS statusStruct;
87
88 openStruct.lpstrDeviceType = _T("avivideo");
89 openStruct.lpstrElementName = (wxChar *)m_filename.mb_str().data();
90 openStruct.hWndParent = 0;
91
92 mciSendCommand(0, MCI_OPEN,
93 MCI_OPEN_ELEMENT|MCI_DGV_OPEN_PARENT|MCI_OPEN_TYPE|MCI_DGV_OPEN_32BIT,
94 (DWORD)(LPVOID)&openStruct);
95 m_internal->m_dev_id = openStruct.wDeviceID;
96
97
98 setStruct.dwCallback = 0;
99 setStruct.dwTimeFormat = MCI_FORMAT_FRAMES;
100
101 mciSendCommand(m_internal->m_dev_id, MCI_SET, MCI_SET_TIME_FORMAT,
102 (DWORD)(LPVOID)&setStruct);
103
104
105 statusStruct.dwCallback = 0;
106 statusStruct.dwItem = MCI_DGV_STATUS_FRAME_RATE;
107 mciSendCommand(m_internal->m_dev_id, MCI_STATUS,
108 MCI_STATUS_ITEM,
109 (DWORD)(LPVOID)&statusStruct);
110
111 m_frameRate = ((double)statusStruct.dwReturn) / 1000;
112
113 statusStruct.dwItem = MCI_DGV_STATUS_BITSPERSAMPLE;
114 mciSendCommand(m_internal->m_dev_id, MCI_STATUS, MCI_STATUS_ITEM,
115 (DWORD)(LPVOID)&statusStruct);
116 m_bps = statusStruct.dwReturn;
117
118}
119
120bool wxVideoWindows::Pause()
121{
122 if (m_paused || m_stopped)
123 return TRUE;
124 m_paused = TRUE;
125 return (mciSendCommand(m_internal->m_dev_id, MCI_PAUSE, MCI_WAIT, 0) == 0);
126}
127
128bool wxVideoWindows::Resume()
129{
130 if (!m_paused || m_stopped)
131 return TRUE;
132 m_paused = FALSE;
133 return (mciSendCommand(m_internal->m_dev_id, MCI_RESUME, 0, 0) == 0);
134}
135
136bool wxVideoWindows::IsPaused() const
137{
138 return m_paused;
139}
140
141bool wxVideoWindows::IsStopped() const
142{
143 return m_stopped;
144}
145
146bool wxVideoWindows::GetSize(wxSize& size) const
147{
148 size.SetWidth(200);
149 size.SetHeight(200);
150 return TRUE;
151}
152
153bool wxVideoWindows::SetSize(wxSize WXUNUSED(size))
154{
155 return TRUE;
156}
157
158bool wxVideoWindows::IsCapable(wxVideoType v_type) const
159{
160 return (v_type == wxVIDEO_MSAVI);
161}
162
163bool wxVideoWindows::AttachOutput(wxWindow& output)
164{
165 MCI_DGV_WINDOW_PARMS win_struct;
166
167 if (!wxVideoBaseDriver::AttachOutput(output))
168 return FALSE;
169
170 win_struct.hWnd = (HWND)output.GetHWND();
171 mciSendCommand(m_internal->m_dev_id, MCI_WINDOW,
172 MCI_DGV_WINDOW_HWND, (DWORD)(LPVOID)&win_struct);
173 return TRUE;
174}
175
176void wxVideoWindows::DetachOutput()
177{
178 MCI_DGV_WINDOW_PARMS win_struct;
179
180 wxVideoBaseDriver::DetachOutput();
181
182 win_struct.hWnd = 0;
183 mciSendCommand(m_internal->m_dev_id, MCI_WINDOW,
184 MCI_DGV_WINDOW_HWND, (DWORD)(LPVOID)&win_struct);
185}
186
187bool wxVideoWindows::Play()
188{
189 if (!m_stopped)
190 return FALSE;
191 m_stopped = FALSE;
192 return (mciSendCommand(m_internal->m_dev_id, MCI_PLAY, 0, NULL) == 0);
193}
194
195bool wxVideoWindows::Stop()
196{
197 MCI_SEEK_PARMS seekStruct;
198
199 if (m_stopped)
200 return FALSE;
201 m_stopped = TRUE;
202 if (::mciSendCommand(m_internal->m_dev_id, MCI_STOP, MCI_WAIT, NULL) != 0)
203 return FALSE;
204
205 seekStruct.dwCallback = 0;
206 seekStruct.dwTo = 0;
207 return (::mciSendCommand(m_internal->m_dev_id, MCI_SEEK, MCI_SEEK_TO_START|MCI_WAIT, (DWORD)(LPVOID)&seekStruct) == 0);
208}
209
210// TODO TODO
211// I hate windows :-(. The doc says MCI_STATUS should return all info I want but when I call it
212// it returns to me with an UNSUPPORTED_FUNCTION error. I will have to do all by myself. Grrrr !
213
214wxString wxVideoWindows::GetMovieCodec() const
215{
216 return wxT("No info");
217}
218
219wxString wxVideoWindows::GetAudioCodec() const
220{
221 return wxT("No info");
222}
223
224wxUint32 wxVideoWindows::GetSampleRate() const
225{
226 return 22500;
227}
228
229wxUint8 wxVideoWindows::GetChannels() const
230{
231 return 1;
232}
233
234wxUint8 wxVideoWindows::GetBPS() const
235{
236 return m_bps;
237}
238
239double wxVideoWindows::GetFrameRate() const
240{
241 return m_frameRate;
242}
243
244wxUint32 wxVideoWindows::GetNbFrames() const
245{
246 return 0;
247}
248
249#endif
250 // __WINDOWS__