こんにちは。 windowsプログラムでMCIコマンドを使ってCDの音楽ファイルを再生するプログラムを作りました。(http://www13.plala.or.jp/kymats/study/MULTIMEDIA …というサイトのソースを使わせていただきました。) 左クリックするごとに次の曲に進むのですが、何もしないと今再生中の曲が終わると止まってしまいます。同じ曲をループさせたいのですが、どうすればいいのでしょうか?
http://www13.plala.or.jp/kymats/study/MULTIMEDIA …
というサイトに行ってMCIのループに関することを読んだのですが、
このサイトにのっていたのは一つのファイルをループさせるソースコードでCDのトラックのように複数のファイルの中から左クリックによってファイルを選んで再生をループするようなプログラムにしたいのですが
どうすればいいのでしょうか?
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
こんばんは。
こう言うことでしょうか。・左クリックでトラックを進める
・左クリックで最後のトラックを超えると停止
・左クリックしないとそのトラックを繰り返す
#include<windows.h>
#pragma comment(lib,"winmm")
//デバイスデータ
static MCI_OPEN_PARMS _S_mop;
//再生中のトラック
static DWORD _S_track = 0;
//オープン
static const MCI_OPEN_PARMS Open(HWND hWnd, LPCTSTR lpstrDeviceType = "CDAudio")
{
MCI_OPEN_PARMS mop = {0};
mop.lpstrDeviceType = lpstrDeviceType;
mop.dwCallback= (DWORD)hWnd;
mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE, (DWORD)&mop);
return mop;
}
//クローズ
static void Close(const MCI_OPEN_PARMS& mop)
{
//停止
mciSendCommand(mop.wDeviceID, MCI_STOP, 0, 0);
//クローズ
mciSendCommand(mop.wDeviceID, MCI_CLOSE, 0, 0);
}
//トラック数の取得
static DWORD GetTrackCount(const MCI_OPEN_PARMS& mop)
{
MCI_STATUS_PARMS status = {0};
status.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;
mciSendCommand(mop.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&status);
return status.dwReturn;
}
//時間フォーマットの変更
static void SetTimeFormat(const MCI_OPEN_PARMS& mop)
{
MCI_SET_PARMS msp = {0};
msp.dwTimeFormat = MCI_FORMAT_TMSF;
mciSendCommand(mop.wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)&msp);
}
//再生
static DWORD Play(const MCI_OPEN_PARMS& mop, HWND hWnd, DWORD dwPos)
{
const DWORD dwTrackSum = ::GetTrackCount(mop);
MCI_PLAY_PARMS mpp = {0};
mpp.dwCallback= (DWORD)hWnd;
mpp.dwFrom= MCI_MAKE_TMSF(dwPos, 0, 0, 0);
mpp.dwTo= MCI_MAKE_TMSF(dwPos + 1, 0, 0, 0);
//トラック末端以外
if(mpp.dwFrom >= 1 && mpp.dwTo <= dwTrackSum)
{
mciSendCommand(mop.wDeviceID, MCI_PLAY, MCI_FROM | MCI_TO | MCI_NOTIFY, (DWORD)&mpp);
return dwPos;
}
//トラック末端
else if(mpp.dwFrom == dwTrackSum)
{
mciSendCommand(mop.wDeviceID, MCI_PLAY, MCI_FROM | MCI_NOTIFY, (DWORD)&mpp);
return dwPos;
}
//次のトラックがないので停止
mciSendCommand(mop.wDeviceID, MCI_STOP, 0, 0);
return 0;
}
//再生トラック番号などの表示
static void PrintTrack(HDC hDC, DWORD dwPos)
{
//文字のゴミを消す為に塗り潰す
RECT rc;
::GetClientRect(::WindowFromDC(hDC), &rc);
::FillRect(hDC, &rc, (HBRUSH)::GetStockObject(WHITE_BRUSH));
TCHAR str[256] = {0};
if(dwPos == 0)
{
wsprintf(str, "%s", "停止中");
}
else
{
wsprintf(str, "%s = %d", "トラック再生中", dwPos);
}
TextOut(hDC, 0, 0, str, lstrlen(str));
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
_S_mop = ::Open(hWnd);
SetTimeFormat(_S_mop);
InvalidateRect(hWnd, NULL, FALSE);
return 0;
case WM_LBUTTONDOWN:
_S_track = Play(_S_mop, hWnd, ++_S_track);
InvalidateRect(hWnd, NULL, FALSE);
return 0;
case MM_MCINOTIFY:
//フラグが楽曲再生終了を意味している時
if(wParam == MCI_NOTIFY_SUCCESSFUL)
{
//同じ楽曲を度再生する
_S_track = Play(_S_mop, hWnd, _S_track);
InvalidateRect(hWnd, NULL, FALSE);
}
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hDC = BeginPaint(hWnd, &ps);
PrintTrack(hDC, _S_track);
EndPaint(hWnd,&ps);
}
return 0;
case WM_CLOSE:
Close(_S_mop);
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
MSG msg;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = __FILE__;
if(!RegisterClass(&wc))
return 0;
HWND hWnd = CreateWindow(__FILE__,"MCIコマンドによるCD再生", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
if(hWnd == NULL)
return 0;
while(GetMessage(&msg, NULL, 0, 0) == TRUE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
この回答への補足
ありがとうございます。 書いていただいたソースコードを実行しました。 しかし、
・左クリックしないとそのトラックを繰り返す
の処理だけがなぜか行われず、そのまま音が止まってしまいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ノートパソコン iTunesで取り込んだ音楽が音飛びします。 2 2022/05/05 21:37
- C言語・C++・C# プログラム内から、MIDIファイルの一部分だけを再生する方法 1 2023/02/15 11:08
- 音楽・動画 ノートパソコンで動画再生の設定の変更について*長文ですが何卒宜しくお願い致します。 3 2022/10/18 12:24
- スピーカー・コンポ・ステレオ 高音質でCDに書き込みしたいです。 11 2022/04/05 14:45
- Windows 10 explorerをedgeで開く方法 2 2022/06/05 14:59
- USBメモリー・SDカード・フラッシュメモリー ウィンドーズ メディアプレーヤー でディスクへの書き込みが突然できなくなくなってしまいました。 2 2022/05/10 23:07
- iPod・ウォークマン・音楽プレーヤー itunes 音楽再生時の音飛び 4 2022/11/30 17:24
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- スピーカー・コンポ・ステレオ 位相が反転しているのか 2 2022/12/15 15:55
- 画像編集・動画編集・音楽編集 YouTubeを録音できるソフトを教えてください。 5 2023/02/12 10:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DirectShowを用いたmpgファイル...
-
ダイアログプログラムでEnterキ...
-
C言語win32api、エディットボッ...
-
「an=(n-1)/(n+1)のときlim[n→∞...
-
Enterキーを押されたら次の処理...
-
マイナスからプラスへ転じた時...
-
10個出力で改行したいのですが...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
fgetsなどのときのstdinのバッ...
-
2÷3などの余りについて
-
*をユーザーが入力した数字の数...
-
DWORDの実際の型は何でしょうか
-
入力した文字列から母音だけを...
-
visualstudio C# テキストボッ...
-
数字以外が入力されたらエラー...
-
プログラムでの数字につく”f”の...
-
int main()、void main()、void...
-
変数とパラメータとは違うもの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Win32APIでウィンドウを中央に...
-
オーバーレイみたいな処理がしたい
-
ダイアログプログラムでEnterキ...
-
キャレットの現在位置の表示 (W...
-
PeekMessageについて
-
ウィンドウ非表示に時に表示し...
-
C#のswitch文を簡略化したいの...
-
C言語win32api、エディットボッ...
-
音量調節
-
LoadImageを使用し、タイトルバ...
-
プログラミングでエラーが出ま...
-
エディットコントロール入力時...
-
ウィンドウハンドルがメッセー...
-
ボタンの色(WINAPI)
-
画像を表示したいのですが……
-
WINAPIでキーから文字列を入力...
-
エラー Run-Time Check Failur...
-
エディットボックスの背景の色...
-
Win32APIでアイコンファイルを...
-
WM_KEYDOWNでPrtScを捕まえる方...
おすすめ情報