source: trunk/classes/mm-progs/MMPlayer/playaudio.c

Last change on this file was 193, checked in by gyoung, 14 months ago

Fix the media file identification code so the internal audio player plays MIDI files

File size: 7.8 KB
Line 
1/*
2 * mmplayer.c (C) Chris Wohlgemuth 2002-2003
3 *
4 */
5/*
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; see the file COPYING. If not, write to
18 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20/*
21 * If you need another license for your project/product (commercial,
22 * noncommercial, whatever) contact me at
23 *
24 * http://www.os2world.com/cdwriting
25 * http://www.geocities.com/SiliconValley/Sector/5785/
26 *
27 */
28
29#define INCL_DOS
30#define INCL_DOSFILEMGR
31#define INCL_DOSERRORS
32#define INCL_WIN
33#define INCL_OS2MM
34#define INCL_MMIOOS2
35#define INCL_MCIOS2
36#define INCL_GPI
37#define INCL_PM
38
39#include <os2.h>
40
41#include <sys\types.h>
42#include <sys\stat.h>
43#include <stdio.h>
44#include <string.h>
45#include <stdlib.h>
46#include "os2me.h"
47#include "common.h"
48#include "mmplayerres.h"
49#include "mmplayer.h"
50
51#if 0
52#define _PMPRINTF_
53#include "PMPRINTF.H"
54#endif
55
56/* The object window controling the trac playing */
57HWND hwndPlayObject;
58extern PID ulPid;
59/* TRUE when track is playing */
60extern BOOL bIsPlaying;
61/* TRUE when track is paused */
62extern BOOL bPaused;
63/* Current time in track */
64extern ULONG ulPos;
65extern ULONG ulTotalLength;
66extern BOOL bIsMidi;
67extern ULONG ulVolume;
68
69extern char chrSourceName[CCHMAXPATH];
70
71void showPlayTimeDisplay(HWND hwndFrame, BOOL bShow);
72void _resetDisplay(HWND hwndFrame);
73void setPlayTimeText2( HWND hwndDialog, char * theText);
74
75BOOL pauseAudioFile(HWND hwndFrame)
76{
77 int iWavePriv;
78 char chrCommand[50];
79 char retMsg[100];
80
81 iWavePriv=ulPid;
82
83 if(bPaused) {
84 sprintf(chrCommand,"RESUME wave%d wait", iWavePriv);
85 mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
86 bPaused=FALSE;
87 showPlayTimeDisplay( hwndFrame, TRUE);
88 }
89 else {
90 sprintf(chrCommand,"PAUSE wave%d wait", iWavePriv);
91 mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
92 bPaused=TRUE;
93 }
94 return TRUE;
95}
96
97BOOL stopAudioFile(HWND hwndFrame)
98{
99 int iWavePriv;
100 char chrCommand[50];
101 char retMsg[100];
102
103 iWavePriv=ulPid;
104
105 if(bIsPlaying) {
106 sprintf(chrCommand,"stop wave%d wait", iWavePriv);
107 mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
108
109 sprintf(chrCommand,"close wave%d wait", iWavePriv);
110 mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
111
112 _resetDisplay(hwndFrame);
113 showPlayTimeDisplay( hwndFrame, TRUE);
114 WinStopTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY);
115 bIsPlaying=FALSE;
116 bPaused=FALSE;
117 }
118 return TRUE;
119}
120
121ULONG playAudioFile(HWND hwndFrame)
122{
123 char chrCommand[CCHMAXPATH*2];
124 char chrDevice[30] = {0};
125 char retMsg[20];
126 ULONG rc;
127 int iWavePriv;
128 int iTime2 = 0;
129 HWND hwndNotify;
130
131
132 if(bPaused)
133 {
134 pauseAudioFile(hwndFrame);
135 return 1;
136 }
137
138
139 iWavePriv=++ulPid;
140 ulPos=0;
141
142 stopAudioFile(hwndFrame);
143
144#if 0
145#endif
146
147#if 0
148 if(!getMessage(chrCommand, IDSTR_STARTINGTRACK, sizeof(chrCommand), queryResModuleHandle(), hwndFrame))
149#endif
150 sprintf(chrCommand, "Starting track...");
151 setPlayTimeText2(hwndFrame, chrCommand);
152
153 if(bIsMidi)
154 strncpy(chrDevice,"sequencer", sizeof(chrDevice) - 1);
155 else
156 strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice) - 1);
157
158 hwndNotify=hwndFrame;//WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE);
159 /* Start audio file */
160 sprintf(chrCommand,"open \"%s\" type %s alias wave%d shareable wait", chrSourceName, chrDevice, iWavePriv);
161 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwndNotify, 0);
162 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
163 return 0;
164 }
165
166 /* Set time format */
167 sprintf(chrCommand,"SET wave%d TIME FORMAT MILLISECONDS wait", iWavePriv);
168 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
169 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
170 sprintf(chrCommand,"close wave%d wait",iWavePriv);
171 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
172 return 0;
173 }
174
175#if 0
176 sprintf(chrCommand,"SETPOSITIONADVISE wave%d ON EVERY 1000 notify", iWavePriv);
177 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg),hwndNotify, 0);
178 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
179 sprintf(chrCommand,"close wave%d wait",iWavePriv);
180 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
181 return 0;
182 }
183#endif
184
185 /* Get wave length in ms */
186 sprintf(chrCommand,"STATUS wave%d LENGTH WAIT", iWavePriv);
187 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
188 if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
189 iTime2=atoi(retMsg);
190 sprintf(chrCommand,"%d:%02d %d:%02d -%d:%02d",iTime2/1000/60,(iTime2/1000)%60,
191 0, 0,
192 iTime2/1000/60,(iTime2/1000)%60);
193 }
194 ulTotalLength=iTime2;
195
196
197 /* Set volume */
198 sprintf(chrCommand,"SET wave%d AUDIO VOLUME %ld wait", iWavePriv, ulVolume);
199 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
200 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
201 sprintf(chrCommand,"close wave%d",iWavePriv);
202 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
203 return 0;
204 }
205
206 sprintf(chrCommand,"play wave%d FROM 0", iWavePriv);
207 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
208 if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
209 sprintf(chrCommand,"close wave%d",iWavePriv);
210 rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
211 return 0;
212 }
213
214 WinStartTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY, PLAYTIMER_DELAY);
215
216 bIsPlaying=TRUE;
217 return 1;
218}
219
220BOOL seekAudioFile(LONG lPosSec)
221{
222 char chrCommand[50];
223 char retMsg[20];
224
225 sprintf(chrCommand,"PLAY wave%ld from %ld", ulPid, lPosSec);
226 mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
227 // ulStartPosition=lPosSec;
228 bPaused=FALSE;
229
230 return TRUE;
231}
232
233void controlPlaying(HWND hwndDialog, ULONG ulAction, ULONG ulReserved)
234{
235 WinPostMsg(hwndPlayObject, WM_APPTERMINATENOTIFY, MPFROMP(hwndDialog), MPFROMLONG(ulAction));
236}
237
238MRESULT EXPENTRY playObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
239{
240 switch (msg)
241 {
242 case WM_APPTERMINATENOTIFY:
243 {
244 HWND hwndFrame=HWNDFROMMP(mp1);
245
246
247 switch(LONGFROMMP(mp2))
248 {
249 case PLAY_FIRST:
250 playAudioFile(hwndFrame);
251 break;
252 case STOP_TRACK:
253 stopAudioFile(hwndFrame);
254 break;
255 case PAUSE_TRACK:
256 pauseAudioFile(hwndFrame);
257 break;
258 default:
259 break;
260 }
261 return (MRESULT)0;
262 }
263 case WM_CLOSE:
264
265 break;
266 default:
267 break;
268 }
269 return WinDefWindowProc( hwnd, msg, mp1, mp2);
270}
271
272/* Every folder has one running play thread to handle play commands */
273void playThreadFunc (void *arg)
274{
275 HAB hab;
276 HMQ hmq;
277 QMSG qmsg;
278
279 hab=WinInitialize(0);
280 if(hab) {
281 hmq=WinCreateMsgQueue(hab,0);
282 if(hmq) {
283
284 hwndPlayObject=WinCreateWindow(HWND_OBJECT,WC_STATIC,"MFObj",0,0,0,0,0,NULLHANDLE,HWND_BOTTOM,13343,NULL,NULL);
285 if(hwndPlayObject) {
286 WinSubclassWindow(hwndPlayObject,&playObjectProc);
287 /* Window created. */
288 while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
289 WinDispatchMsg(hab,&qmsg);
290
291 WinDestroyWindow(hwndPlayObject);
292 }
293 WinDestroyMsgQueue(hmq);
294 }
295 WinTerminate(hab);
296 }
297}
298
299
Note: See TracBrowser for help on using the repository browser.