- 締切済み
トラックのループの仕方
こんにちは。 windowsプログラムでMCIコマンドを使ってCDの音楽ファイルを再生するプログラムを作りました。(http://www13.plala.or.jp/kymats/study/MULTIMEDIA/mciCommand_cd.cppというサイトのソースを使わせていただきました。) 左クリックするごとに次の曲に進むのですが、何もしないと今再生中の曲が終わると止まってしまいます。同じ曲をループさせたいのですが、どうすればいいのでしょうか? http://www13.plala.or.jp/kymats/study/MULTIMEDIA/mciCommand_callback.html というサイトに行ってMCIのループに関することを読んだのですが、 このサイトにのっていたのは一つのファイルをループさせるソースコードでCDのトラックのように複数のファイルの中から左クリックによってファイルを選んで再生をループするようなプログラムにしたいのですが どうすればいいのでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- machongola
- ベストアンサー率60% (434/720)
こんばんは。こう言うことでしょうか。 ・左クリックでトラックを進める ・左クリックで最後のトラックを超えると停止 ・左クリックしないとそのトラックを繰り返す #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; }
補足
ありがとうございます。 書いていただいたソースコードを実行しました。 しかし、 ・左クリックしないとそのトラックを繰り返す の処理だけがなぜか行われず、そのまま音が止まってしまいます。