-
Notifications
You must be signed in to change notification settings - Fork 0
/
speedplay-mci.c
executable file
·166 lines (146 loc) · 5.75 KB
/
speedplay-mci.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/*******************************************************************************************************
* ファイル名: speedplay-mci.cpp
* ファイルの内容:Speedplay 用の MCIコマンド生成/送信処理コード
* 作成者:fuwuyuan/市川ゆり子
* ライセンス/Licensing:
* このファイルは、著作者である fuwuyuan/市川ゆり子 によってMIT Licenseのもと公開されています。
*
* Copyright (c) 2015 fuwuyuan/市川ゆり子
* This software is released under the MIT License, see LICENSE.txt.
* http://opensource.org/licenses/mit-license.php
*******************************************************************************************************/
#pragma comment(lib, "winmm.lib")
#include <windows.h>
#include <tchar.h>
#include <mmsystem.h>
#include "speedplay-mci.h"
/*********************************************************************************
* 関数名: LPTSTR getPositionReadable()
* 機能: 現在位置を HumanReadable で取得する
* (mm:ss.sssという形式で)
* 引数: なし
* 返却値: LPTSTR
**********************************************************************************/
LPTSTR getPositionReadable() {
static TCHAR szMCIReturnString[64] = TEXT("");
UINT intbuf,msbuf,ms,second,minute;
/* 現在位置の取得 */
mciSendString(TEXT("status speedplay position"), szMCIReturnString, 64, NULL);
/* UINTへ変換 */
intbuf = _ttoi(szMCIReturnString);
/* HumanReadableへ変換 */
msbuf = intbuf / 1000;
ms = intbuf % 1000;
minute = msbuf / 60;
second = minute * 60;
second = msbuf - second;
#if _MSC_VER >= 1400 //VisualStudio2005以上
_stprintf_s(szMCIReturnString,sizeof szMCIReturnString / sizeof szMCIReturnString[0], TEXT("%3u:%2u.%3u"), minute, second, ms);
#else
_stprintf(szMCIReturnString, TEXT("%3u:%2u.%3u"), minute, second, ms);
#endif // _MSC_VER >= 1400
return szMCIReturnString;
}
/*********************************************************************************
* 関数名: void openMCI(LPCTSTR lpstrFile)
* 機能: MCIを使ってファイルを開く
* 引数:
* ファイル名( LPCTSTR lpstrFile )
* 返却値: なし
**********************************************************************************/
void openMCI(LPCTSTR lpstrFile) {
/* 変数宣言 */
TCHAR szCommand[1024] = TEXT("");
TCHAR szError[128] = TEXT("");
MCIERROR lMCIError;
/* コマンド生成/送出 */
_stprintf( szCommand, TEXT("open \"%s\" type MpegVideo alias speedplay"), lpstrFile);
lMCIError = mciSendString(szCommand, NULL, 0, NULL);
/* エラーの場合は、エラー原因を取得して、メッセージボックス表示 */
if(lMCIError != 0) {
mciGetErrorString( lMCIError, szError, 128);
MessageBox(NULL, szError, TEXT("null"), MB_OK);
}
}
/*********************************************************************************
* 関数名: void initMCI(int speed)
* 機能: 時間単位、再生速度などの初期化を行う
* 引数:
* 再生速度( UINT speed )
* 返却値: なし
**********************************************************************************/
void initMCI(UINT speed) {
/* 変数宣言 */
TCHAR szCommand[1024] = TEXT("");
/* 時間単位をms(ミリ秒)に設定 */
mciSendString( TEXT("set speedplay time format ms"), NULL, 0, NULL);
/* 再生速度を設定(別のファイルを開いても、前のファイルの速度設定が引きつがれる) */
_stprintf( szCommand, TEXT("set speedplay speed %u"), speed);
mciSendString( szCommand, NULL, 0, NULL);
}
/*********************************************************************************
* 関数名: void change_speedMCI(int speed)
* 機能: 再生速度を変更する
* 引数:
* 再生速度( UINT speed )
* 標準速度:NORMAL_SPEED
* 返却値: なし
**********************************************************************************/
void change_speedMCI(UINT speed) {
TCHAR szCommand[64] = TEXT("");
/* コマンド生成/送信 */
_stprintf( szCommand, TEXT("set speedplay speed %u"), speed);
mciSendString( szCommand, NULL,0,NULL);
}
/*********************************************************************************
* 関数名: void overlayDestination(HWND hwnd)
* 機能: ビデオオーバーレイ表示先を設定する
* 引数:
* ビデオオーバーレイ表示先ウインドウハンドル( HWND hwnd )
* オーバーレイの左上x座標(UINT x)
* オーバーレイの左上y座標(UINT y)
* オーバーレイの右下x座標(UINT sizeX)
* オーバーレイの右下y座標(UINT sizeY)
* 返却値: なし
**********************************************************************************/
void overlayDestination(HWND hwnd,UINT x, UINT y, UINT sizeX, UINT sizeY) {
TCHAR szCommand[1024] = TEXT("");
/* コマンド生成/送信 */
_stprintf( szCommand, TEXT("window speedplay handle %u"), (unsigned long long) hwnd);
mciSendString( szCommand , NULL, 0, NULL);
/* コマンド生成/送信 */
_stprintf( szCommand, TEXT("put speedplay destination at %u %u %u %u"), x, y, sizeX, sizeY);
mciSendString( szCommand , NULL, 0, NULL);
}
/*********************************************************************************
* 関数名: void seek_incMCI(int ms,int flag)
* 機能: 現在位置からの相対シークを行う
* 引数:
* 送り量(ミリ秒)( int ms )
* シーク方向フラグ( UINT flag )
* 送り方向:SEEK_FWD
* 戻し方向:SEEK_REV
* 返却値: なし
**********************************************************************************/
void seek_incMCI(int ms, UINT flag) {
TCHAR szMCIReturnString[64] = TEXT(""),szCommand[128];
int position;
/* 現在位置の取得 */
mciSendString(TEXT("status speedplay position"), szMCIReturnString, 64,NULL);
/* 現在位置をintへ変換 */
position = _ttoi(szMCIReturnString);
/* 送り/戻し判別して分岐 */
switch(flag) {
case SEEK_FWD:
/* positionを引数ミリ秒分だけ加算 */
position += ms;
break;
case SEEK_REV:
/* positionを引数ミリ秒分だけ減算 */
position -= ms;
break;
}
/* コマンド生成/送信 */
_stprintf(szCommand, TEXT("play speedplay from %u"), position);
mciSendString(szCommand, NULL, 0, NULL);
}