MCIコマンド助けて!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

MCIコマンド助けて!

#1

投稿記事 by 神族 » 12年前

MIDI再生はできたけど何故かMP3が再生できない・・・ (´・ω・`)ショボーン
一応コンパイルエラーとMCIのエラーは、ありませんでした。どうしればいいのか教えて下さい! 。・゚゚・(≧д≦)・゚゚・。エーン!!

コード:

char buf[1000];
DWORD dwFlags=0;
MCI_OPEN_PARMS mop;
 
dwFlags|=MCI_OPEN_TYPE;
mop.lpstrDeviceType="MPEGVideo";
 
dwFlags|=MCI_OPEN_ELEMENT;
mop.lpstrElementName="test.mp3";
 
dwFlags|=MCI_WAIT;
MCIERROR ret=mciSendCommand(NULL,MCI_OPEN,dwFlags,(DWORD)&mop);
if(ret==0){
     mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
}else{
     mciGetErrorString(ret,buf,sizeof(buf));
     MessageBox::Show(gcnew String(buf),"error");
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MCIコマンド助けて!

#2

投稿記事 by softya(ソフト屋) » 12年前

MCI_PLAYのエラーをチェックしていないようですが?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

Re: MCIコマンド助けて!

#3

投稿記事 by 神族 » 12年前

softya(ソフト屋) さんが書きました:MCI_PLAYのエラーをチェックしていないようですが?
どうしればMCI_PLAYのエラー確認できますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MCIコマンド助けて!

#4

投稿記事 by softya(ソフト屋) » 12年前

それは、MCI_OPENと同じ仕組みで良いはずですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

Re: MCIコマンド助けて!

#5

投稿記事 by 神族 » 12年前

softya(ソフト屋) さんが書きました:それは、MCI_OPENと同じ仕組みで良いはずですが。

コード:

mciGetErrorString(ret,buf,sizeof(buf));
のは駄目なんですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MCIコマンド助けて!

#6

投稿記事 by softya(ソフト屋) » 12年前

MCI_OPENは
MCIERROR ret=mciSendCommand(NULL,MCI_OPEN,dwFlags,(DWORD)&mop);
if(ret==0){
で戻り値をチェックしてますが、MCI_PLAYの
mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
は何もしてませんよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

Re: MCIコマンド助けて!

#7

投稿記事 by 神族 » 12年前

softya(ソフト屋) さんが書きました:MCI_OPENは
MCIERROR ret=mciSendCommand(NULL,MCI_OPEN,dwFlags,(DWORD)&mop);
if(ret==0){
で戻り値をチェックしてますが、MCI_PLAYの
mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
は何もしてませんよね?
あああwてことはMCI_PLAYにも同じようにエラー探せばいいのですね?試してエラー探してみます

神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

Re: MCIコマンド助けて!

#8

投稿記事 by 神族 » 12年前

softya(ソフト屋) さんが書きました:MCI_OPENは
MCIERROR ret=mciSendCommand(NULL,MCI_OPEN,dwFlags,(DWORD)&mop);
if(ret==0){
で戻り値をチェックしてますが、MCI_PLAYの
mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
は何もしてませんよね?
エラー探してみたら何も発生しなかった。・・・って言うかIF無しで普通にエラー確認の出そうとしても何故か表示しない・・・・・・・・・
俺の予想ではmciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);に止まってる?かもしれない・・・ (・ω・ ;)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MCIコマンド助けて!

#9

投稿記事 by softya(ソフト屋) » 12年前

すいません。さっぱり分かりません。
どの様なプログラムを実行して、結果はどうなったか教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

Re: MCIコマンド助けて!

#10

投稿記事 by 神族 » 12年前

ちょっとコード変えてドラッグアンドドロップ対応したMCI作ってみたんだけどやはり前のコードと同じくMP3が再生駄目みたい・・・(MIDIは再生できてる)
ドラッグエンターは俺がOKした拡張子のみにしてるので問題ないです。

コード:

		//文字列配列
		static array<System::String^>^ files;
		static array<System::String^>^ iType={".3g2",".3gp",".3gp2",".3gpp",".aac",
											  ".adt",".adts",".aif",".aifc",".aiff",
											  ".asf",".asx",".au",".dat",".ivf",
											  ".m1v",".m2t",".m2ts",".m2v",".m3u",
											  ".m4a",".m4v",".mod",".mov",".mp2",
											  ".mp2v",".mp3",".mp4",".mp4v",".mpa",
											  ".mpe",".mpeg",".mpg",".mpv2",".mts",
											  ".snd",".ts",".tts",".wax",".wm",
											  ".wma",".wmv",".wmx",".wpl",".wvx",
											  ".avi",".cda",".wav",".mid",".midi",
											  ".rmi"
											 };
		//ファイルドラッグアンドドロップ
	private: System::Void Form1_DragDrop(System::Object^  sender, System::Windows::Forms::DragEventArgs^  e) {
				 //if
				 if(e ->Data ->GetDataPresent(DataFormats::FileDrop)){//もしファイルドロップされた場合
					 //文字列配列
					 files=array<System::String^>(e->Data->GetData(DataFormats::FileDrop , false));
					 //if
					 if(setPlayer((char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(findType(0)).ToPointer(),
								  (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(files[0]).ToPointer())==true){
									  //playMusicメソッド
									  playMusic();//playMusicメソッド呼び出し
					 }
				 }//if終了
			 }//メソッド終了
			 //playMusicメソッド
	private: void playMusic(){
				 //char配列
			     char buf[1000];
				 //MCI
				 MCIERROR ret=mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);//MCIコマンド
				 //if
				 if(ret){//もしエラーがある場合
					 //エラー内容取得
					 mciGetErrorString(ret,buf,sizeof(buf));
					 //エラー内容をメッセージボックスに表示
					 MessageBox::Show(gcnew String(buf),"error");
				 }//if終了
			 }//playMusicメソッド終了
			 //setPlayerメソッド
	private: bool setPlayer(char* type,char* file){
				 //char配列
			     char buf[1000];
				 //DWORD
				 DWORD dwFlags=0;
				 //MCIのオープンタイプ設定
				 dwFlags|=MCI_OPEN_TYPE;
				 //タイプ名記入
				 mop.lpstrDeviceType=type;

				 //MCIのオープンエレメント設定
				 dwFlags|=MCI_OPEN_ELEMENT;
				 //ファイル先記入
				 mop.lpstrElementName=file;

				 //MCIのウェイト設定
				 dwFlags|=MCI_WAIT;
				 //MCIコマンド
				 MCIERROR ret=mciSendCommand(NULL,MCI_OPEN,dwFlags,(DWORD)&mop);
				 //エラー確認
				 //if
				 if(ret==0){//もしエラー無ければ
					 //return
					 return true;
				 //if
				 }else{//もしエラー有れば
					 //エラー内容取得
					 mciGetErrorString(ret,buf,sizeof(buf));
					 //エラー内容をメッセージボックスに表示
					 MessageBox::Show(gcnew String(buf),"error");
					 //return
					 return false;
				 }//if終了
			 }//setPlayerメソッド終了
			 //findTypeメソッド
	private: System::String^ findType(int x){
			 //int
			 int mType;
			 //文字列
			 String^ sType; 
			 //for
			 for(int i=0;i<iType->Length;i++){
				 //if
				 if(files[x]->Substring(files[x]->Length-4)->ToLower()==iType[i]){//ファイル拡張子見つけた場合
					 //int
					 mType=i;//i数字をmTypeにコピー
				 }//if終了
			 }//for終了
			 //if
			 if(mType<45){
				 //文字列
				 sType="MPEGVideo";//MPEGVideoをsTypeに入れる
			 //if
			 }else if(mType==45){
				 //文字列
				 sType="avivideo";//avivideoをsTypeに入れる
			 //if
			 }else if(mType==46){
				 //文字列
				 sType="CDAudio";//CDAudioをsTypeに入れる
			 //if
			 }else if(mType==47){
				 //文字列
				 sType="WaveAudio";//WaveAudioをsTypeに入れる
			 //if
			 }else{
				 //文字列
				 sType="Sequencer";//SequencerをsTypeに入れる
			 }//if終了
			 return sType;
		 }//findTypeメソッド終了
どうか、このMP3再生できない謎を解いてください

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MCIコマンド助けて!

#11

投稿記事 by softya(ソフト屋) » 12年前

動いている保証のあるプログラムをコピペして試してみてください。
自分のプログラムの問題なのかシステムの問題なのか切り分けてみましょう。

下記のサイトのプログラムでwavの部分のコメントアウトして試してみてください。
「MCIコマンドによる音声ファイル再生 | WINPAI入門サイト~ETU~」
http://etu.bituse.info/winapi/35

これで鳴らなければWindowsのシステムに問題があるか、再生しようとしているmp3のファイルフォーマットが特殊で再生できないかのどちらかです。
つまり、プログラムが悪くない可能性が高いと言うことです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: MCIコマンド助けて!

#12

投稿記事 by ISLe » 12年前

『mci mp3』でググったらMP3を再生するにはレジストリをいじる必要がある場合がある旨が書かれた記事が見付かります。
エラー出てないっておっしゃっているので違うかもしれませんが。

神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

Re: MCIコマンド助けて!

#13

投稿記事 by 神族 » 12年前

softya(ソフト屋) さんが書きました:動いている保証のあるプログラムをコピペして試してみてください。
自分のプログラムの問題なのかシステムの問題なのか切り分けてみましょう。

下記のサイトのプログラムでwavの部分のコメントアウトして試してみてください。
「MCIコマンドによる音声ファイル再生 | WINPAI入門サイト~ETU~」
http://etu.bituse.info/winapi/35

これで鳴らなければWindowsのシステムに問題があるか、再生しようとしているmp3のファイルフォーマットが特殊で再生できないかのどちらかです。
つまり、プログラムが悪くない可能性が高いと言うことです。
一応MIDIは再生できて後試しにメッセージボックスで拡張子認識など試して問題ないけど問題はMCIが何故かMP3再生できていないという・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MCIコマンド助けて!

#14

投稿記事 by softya(ソフト屋) » 12年前

動かないのは分かりました。
ただ、何を試して動かないのか説明になっていないので、どう試したかを書いてください。
下記のことは試されたのでしょうか?
softya(ソフト屋) さんが書きました:下記のサイトのプログラムでwavの部分のコメントアウトして試してみてください。
「MCIコマンドによる音声ファイル再生 | WINPAI入門サイト~ETU~」
http://etu.bituse.info/winapi/35
ISLeさんの言われた通りMCI全般的にmp3を受けつかないのならレジストリをいじる必要があるのかも知れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

Re: MCIコマンド助けて!

#15

投稿記事 by 神族 » 12年前

softya(ソフト屋) さんが書きました:動かないのは分かりました。
ただ、何を試して動かないのか説明になっていないので、どう試したかを書いてください。
下記のことは試されたのでしょうか?
softya(ソフト屋) さんが書きました:下記のサイトのプログラムでwavの部分のコメントアウトして試してみてください。
「MCIコマンドによる音声ファイル再生 | WINPAI入門サイト~ETU~」
http://etu.bituse.info/winapi/35
ISLeさんの言われた通りMCI全般的にmp3を受けつかないのならレジストリをいじる必要があるのかも知れません。
一応人柱してくれた人に聞いたらMIDIとWAV再生はできたけどMP3は、できなかったらしい。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MCIコマンド助けて!

#16

投稿記事 by softya(ソフト屋) » 12年前

私のところでは「MCIコマンドによる音声ファイル再生 | WINPAI入門サイト~ETU~」のコードは動いています。
私の所はWindows7 64bitです。

神族さんの所では試していないということでしょうか?
あとレジストリは試されたり確認したりされましたか?
それぞれ、yes/noと理由・状況を教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

Re: MCIコマンド助けて!

#17

投稿記事 by 神族 » 12年前

softya(ソフト屋) さんが書きました:私のところでは「MCIコマンドによる音声ファイル再生 | WINPAI入門サイト~ETU~」のコードは動いています。
私の所はWindows7 64bitです。

神族さんの所では試していないということでしょうか?
あとレジストリは試されたり確認したりされましたか?
それぞれ、yes/noと理由・状況を教えて下さい。
俺も試したところMIDIとWAVも再生できました。ただしMP3は駄目だった
他の拡張子はまだ
そしてレジストリ見たところ問題無かったです(ちゃんとMP3もMPEGVideoになってる)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MCIコマンド助けて!

#18

投稿記事 by softya(ソフト屋) » 12年前

それじゃ、前に書いてますが(1)mp3はいろんなフォーマットを試しましたか?(2) それと試したmp3はWindowsMediaPlayerでは再生できますか?
これも、それぞれお答えください。 あと、Windowsのバージョンも教えて下さい。

mp3は標準的な、44.1kか 48kHz STEREO のMPEG-1 Audio Layer-3で bpsは128k, 160k, 192k あたりが良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

Re: MCIコマンド助けて!

#19

投稿記事 by 神族 » 12年前

softya(ソフト屋) さんが書きました:それじゃ、前に書いてますが(1)mp3はいろんなフォーマットを試しましたか?(2) それと試したmp3はWindowsMediaPlayerでは再生できますか?
これも、それぞれお答えください。 あと、Windowsのバージョンも教えて下さい。

mp3は標準的な、44.1kか 48kHz STEREO のMPEG-1 Audio Layer-3で bpsは128k, 160k, 192k あたりが良いでしょう。
WindowsMediaPlayerは、ちゃんとMP3再生できてます
一応標準的なMP3でもWindowsMediaPlayerは再生できましたけどMCIには何故かできない
WindowsバージョンはWindows 7 Ultimate 64Bit Service Pack 1です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MCIコマンド助けて!

#20

投稿記事 by softya(ソフト屋) » 12年前

明日、テストツールを作ってみます。
良かったら、著作権的に問題ない再生できないmp3をダウンロードできるように準備しておいてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

Re: MCIコマンド助けて!

#21

投稿記事 by 神族 » 12年前

softya(ソフト屋) さんが書きました:明日、テストツールを作ってみます。
良かったら、著作権的に問題ない再生できないmp3をダウンロードできるように準備しておいてください。
お願いします!!(^_^)wktk中

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: MCIコマンド助けて!

#22

投稿記事 by softya(ソフト屋) » 12年前

再生テストのプログラムです。動作確認済みで、ウィンドウで右クリックするとファイル入力ダイアログが開くのでmp3ファイルを選んでください。
mciplay.zip
(641 KiB) ダウンロード数: 177 回
これでmp3ファイルが再生できなかったら、そのmp3を掲示板か何処かのアップローダにアップしてください。

ソースコードはかなり適当です。

コード:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")

#define MSG(m) {\
    MessageBoxA(NULL,m,NULL,MB_OK);}

//ウィンドウハンドル
HWND hwnd;
//インスタンスハンドル
HINSTANCE hinst;

//ウィンドウ横幅
#define WIDTH 500
#define HEIGHT 300



LRESULT CALLBACK WinProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) {
	static MCI_OPEN_PARMS open2;
	static MCI_PLAY_PARMS play2;
	static OPENFILENAME ofn = {0};
	static TCHAR strFile[MAX_PATH] , strCustom[256] = TEXT( "Before files\0*.*\0\0" );

	int result;

	char buf[1000];

	switch( msg ) {
	case WM_DESTROY:
		mciSendCommand( open2.wDeviceID, MCI_CLOSE, 0, 0 );

		PostQuitMessage( 0 );
		return 0;

	case WM_CREATE:
		ofn.lStructSize = sizeof ( OPENFILENAME );
		ofn.hwndOwner = hwnd;
		ofn.lpstrFilter =   TEXT( "mp3 files {*.mp3}\0*.mp3\0" )
		                    TEXT( "All files {*.*}\0*.*\0\0" );
		ofn.lpstrCustomFilter = strCustom;
		ofn.nMaxCustFilter = 256;
		ofn.nFilterIndex = 0;
		ofn.lpstrFile = strFile;
		ofn.nMaxFile = MAX_PATH;
		ofn.Flags = OFN_FILEMUSTEXIST;

		return 0;

	case WM_RBUTTONUP:

		GetOpenFileName( &ofn );
		SetWindowText( hwnd , strFile );

		//mp3再生の場合
		open2.lpstrDeviceType = "MPEGVideo";
		open2.lpstrElementName = strFile;
		result = mciSendCommand( 0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
		                         ( DWORD_PTR )&open2 );

		//エラーなら0以外が返る
		if( result ) {
			//エラー取得
			mciGetErrorString( result, buf, sizeof( buf ) );
			MSG( buf );
			PostQuitMessage( 0 );
			return -1;
		}
		
		play2.dwCallback = ( DWORD )hwnd;
		result = mciSendCommand( open2.wDeviceID, MCI_PLAY, MCI_NOTIFY, ( DWORD_PTR )&play2 );
		//エラーなら0以外が返る
		if( result ) {
			//エラー取得
			mciGetErrorString( result, buf, sizeof( buf ) );
			MSG( buf );
			PostQuitMessage( 0 );
			return -1;
		}
		

		return 0;


	case MM_MCINOTIFY:
		if( lp == open2.wDeviceID ) {

			if( wp == MCI_NOTIFY_SUCCESSFUL ) {
				MSG( "再生完了" );
				//シークバーを先頭に戻す
				mciSendCommand( open2.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0 );
			}
			return 0;
		}

	}
	return DefWindowProc( hwnd, msg, wp, lp );
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {
	MSG msg;
	WNDCLASS wc;

	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WinProc;
	wc.cbClsExtra = wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hCursor = wc.hIcon = NULL;
	wc.hbrBackground = ( HBRUSH )GetStockObject( BLACK_BRUSH );
	wc.lpszClassName = "test";
	wc.lpszMenuName = NULL;

	if( !RegisterClass( &wc ) ) {
		MSG( "クラスの登録失敗" );
		return -1;
	}

	//インスタンスハンドル
	hinst = hInstance;

	hwnd = CreateWindowA( "test", "テストウィンドウ", WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
	                      0, 0, 400, 400, NULL, NULL, hInstance, NULL );


	if( hwnd == NULL ) {
		MSG( "ウィンドウ作成失敗" );
		return -1;
	}


	//エラーチェック用変数
	int check;

	while( check = GetMessage( &msg, NULL, 0, 0 ) ) {
		if( check == -1 ) {
			break;
		}
		DispatchMessage( &msg );
	}

	//クラス解放
	UnregisterClass( "test", hinst );

	return 0;

}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

神族
記事: 38
登録日時: 12年前
住所: 日本
連絡を取る:

Re: MCIコマンド助けて!

#23

投稿記事 by 神族 » 12年前

softya(ソフト屋) さんが書きました:再生テストのプログラムです。動作確認済みで、ウィンドウで右クリックするとファイル入力ダイアログが開くのでmp3ファイルを選んでください。
mciplay.zip
これでmp3ファイルが再生できなかったら、そのmp3を掲示板か何処かのアップローダにアップしてください。

ソースコードはかなり適当です。

コード:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")

#define MSG(m) {\
    MessageBoxA(NULL,m,NULL,MB_OK);}

//ウィンドウハンドル
HWND hwnd;
//インスタンスハンドル
HINSTANCE hinst;

//ウィンドウ横幅
#define WIDTH 500
#define HEIGHT 300



LRESULT CALLBACK WinProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) {
	static MCI_OPEN_PARMS open2;
	static MCI_PLAY_PARMS play2;
	static OPENFILENAME ofn = {0};
	static TCHAR strFile[MAX_PATH] , strCustom[256] = TEXT( "Before files\0*.*\0\0" );

	int result;

	char buf[1000];

	switch( msg ) {
	case WM_DESTROY:
		mciSendCommand( open2.wDeviceID, MCI_CLOSE, 0, 0 );

		PostQuitMessage( 0 );
		return 0;

	case WM_CREATE:
		ofn.lStructSize = sizeof ( OPENFILENAME );
		ofn.hwndOwner = hwnd;
		ofn.lpstrFilter =   TEXT( "mp3 files {*.mp3}\0*.mp3\0" )
		                    TEXT( "All files {*.*}\0*.*\0\0" );
		ofn.lpstrCustomFilter = strCustom;
		ofn.nMaxCustFilter = 256;
		ofn.nFilterIndex = 0;
		ofn.lpstrFile = strFile;
		ofn.nMaxFile = MAX_PATH;
		ofn.Flags = OFN_FILEMUSTEXIST;

		return 0;

	case WM_RBUTTONUP:

		GetOpenFileName( &ofn );
		SetWindowText( hwnd , strFile );

		//mp3再生の場合
		open2.lpstrDeviceType = "MPEGVideo";
		open2.lpstrElementName = strFile;
		result = mciSendCommand( 0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
		                         ( DWORD_PTR )&open2 );

		//エラーなら0以外が返る
		if( result ) {
			//エラー取得
			mciGetErrorString( result, buf, sizeof( buf ) );
			MSG( buf );
			PostQuitMessage( 0 );
			return -1;
		}
		
		play2.dwCallback = ( DWORD )hwnd;
		result = mciSendCommand( open2.wDeviceID, MCI_PLAY, MCI_NOTIFY, ( DWORD_PTR )&play2 );
		//エラーなら0以外が返る
		if( result ) {
			//エラー取得
			mciGetErrorString( result, buf, sizeof( buf ) );
			MSG( buf );
			PostQuitMessage( 0 );
			return -1;
		}
		

		return 0;


	case MM_MCINOTIFY:
		if( lp == open2.wDeviceID ) {

			if( wp == MCI_NOTIFY_SUCCESSFUL ) {
				MSG( "再生完了" );
				//シークバーを先頭に戻す
				mciSendCommand( open2.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0 );
			}
			return 0;
		}

	}
	return DefWindowProc( hwnd, msg, wp, lp );
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {
	MSG msg;
	WNDCLASS wc;

	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WinProc;
	wc.cbClsExtra = wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hCursor = wc.hIcon = NULL;
	wc.hbrBackground = ( HBRUSH )GetStockObject( BLACK_BRUSH );
	wc.lpszClassName = "test";
	wc.lpszMenuName = NULL;

	if( !RegisterClass( &wc ) ) {
		MSG( "クラスの登録失敗" );
		return -1;
	}

	//インスタンスハンドル
	hinst = hInstance;

	hwnd = CreateWindowA( "test", "テストウィンドウ", WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
	                      0, 0, 400, 400, NULL, NULL, hInstance, NULL );


	if( hwnd == NULL ) {
		MSG( "ウィンドウ作成失敗" );
		return -1;
	}


	//エラーチェック用変数
	int check;

	while( check = GetMessage( &msg, NULL, 0, 0 ) ) {
		if( check == -1 ) {
			break;
		}
		DispatchMessage( &msg );
	}

	//クラス解放
	UnregisterClass( "test", hinst );

	return 0;

}
おおお再生できているだとお!じゃーこのソースをよく読んで参考にしてみるわwまた何か問題起きたらまた質問しますねwありがとう!

閉鎖

“C言語何でも質問掲示板” へ戻る