• 締切済み

PlaySound APIについて

すみません。どうしても分からない事があったのでご質問させて頂きます。 ACCESSというか、VBなんですが、PlaySound APIのメモリにロードする 使い方がわかりません。書式は、 PlaySound(String lpszName, IntPtr hModule, Int32 dwFlags); だと思うのですが、dwFlagsにSND_MEMORYを指定してメモリにロードしてから 鳴らしたいと考えています。 PlaySoundで普通にWAVを鳴らすと0.5秒ほど読み込みに時間がかかり、その間 処理が止まってしまったので、何とか速くできないかと思い、この方法ならどうかと 思いました。 ご存知の方いらっしゃいましたら、ぜひご教授下さい。 また、他にも高速にWAVを鳴らせる方法などご存知でしたら、ぜひともご教授願い たいと思います。

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

PlaySoundではAPIの仕様上無理です。 DirectX(DirectSound)を使う http://tokyo.cool.ne.jp/kanain/SfDwLd.html waveOutWrite等の低レベルマルチメディアAPIを使用し、ダブルバッファリングを行う #VBのサンプル見つかりませんでした。 なんてのが。

関連するQ&A

  • API FtpPutFileの戻り値

    お世話になっております。 API FtpPutFileを使用しているのですが 確実にFalseになります。一日悩みましたが原因が わかりません。 If FtpPutFile(lngConnect, _ "***.txt", _ "***.txt", _ FTP_TRANSFER_TYPE_ASCII, _ 0&) <> False Then です。必要なものを付け加えておきます。 Private Declare Function FtpPutFile Lib "wininet.dll" _ Alias "FtpPutFileA" _ (ByVal hFtpSession As Long, _ ByRef lpszLocalFile As String, _ ByRef lpszNewRemoteFile As String, _ ByVal dwFlags As Long, _ ByVal dwContext As Long) As Long Private Const FTP_TRANSFER_TYPE_ASCII = &H1& です。環境はWinXP,VB6+SP5 よろしくお願い致します。

  • 計算結果で音を1回で止める方法を教えてください。

    以前、こちらで教えてもらったものを使わせてもらっているんですが、 これを少し改造したいんですが、色々イジってもわかりませんでしたのでご教授ください。 下記の式だと、A3やA7の計算結果で、注文数が在庫数を超えると セルの表示が変わり、各種設定した各フルーツ追加の音が鳴る設定なんですが、 例えばブドウ注文数4個になり、ブドウ在庫数3個を超えると セルの表示がブドウ追加となり、ブドウ追加!と音が鳴るんですが、 更にブドウが5個6個と追加されると、ずっとブドウ追加!と音が鳴り続けます。 これをブドウ追加!と音が鳴ったら、それでブドウ追加音は鳴らないようにしたいんです。 バナナが追加状態になった場合も、バナナ追加!と1回鳴って、 それ以降、バナナ追加が続いても音は終了と。 つまりA3やA7の計算結果1個につき、1回で音は終了にしたいんです。 ◆Excel2003のBOOK1の中で セル A1 ブドウ注文数2個(RSSによりランダムでリアルタイムで変わる) A2 ブドウ在庫数3個(固定数字) A3 =IF(A1>A2,"ブドウ追加"&PlayWave("C:\Sound\ブドウ追加音.wav"),"在庫あり") A5 バナナ注文数2個(RSSによりランダムでリアルタイムで変わる) A6 バナナ在庫数3個(固定数字) A7 =IF(A5>A6,"ブドウ追加"&PlayWave("C:\Sound\ブドウ追加音.wav"),"在庫あり") ◆標準モジュールに以下を書いています。 ' ※以下標準モジュールに貼り付けるユーザー定義関数 ' // Wave ファイルを再生する API ' // 複数の WAV の同時再生はできない。同期再生の場合は、 ' // 再生終了まで一切の操作ができない。 ' Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" ( _     ByVal lpszName As String, _     ByVal hModule As Long, _     ByVal dwFlags As Long) As Long Private Const SND_SYNC As Long = &H0 ' 同期再生 Private Const SND_ASYNC As Long = &H1 ' 非同期再生 Private Const SND_PURGE As Long = &H40 ' 再生停止 ' // Wave ファイルを再生する. ' Public Function PlayWave(ByVal WaveFileName As String) As String      ' @引数 WaveFileName : 再生する Wave ファイル名   ' 必ず長さ0の文字列を返す      Call PlaySound(WaveFileName, 0&, SND_SYNC)   PlayWave = vbNullString End Function

  • VBで音声再生に関して

    ヘッダ情報のない16_khz,16_bitの音声ファイルをwavへの変換なしで直接取り出して 再生したいのですが、再生するAPIかなにかないでしょうか? メモリー上にバイト型配列でおきwavのヘッダ情報をつけ音声ファイルをくっつける という方法を考えついたのですが それだとPlaySound()APIではメモリー上から呼び出せず困っています。 wavファイルのヘッダ情報についてもわかりません。

  • 再生音声の音量を変更する関数を教えてください.

    みなさんこんにちは. 今,VisualStudio.Net2005を使って簡易な音声再生ソフトを作ろうと考えております. PlaySound( L"soundfilename.wav", NULL, (int)(SND_ASYNC | SND_FILENAME)); の関数で引数の音声ファイルを再生することまではできましたが,再生中の音声のボリュームを変更する方法が分かりません. どなたか,再生中の音声のボリュームを変更する方法や関数を知っているかたがいらっしゃたら教えていただきたく存じ上げます. 何卒よろしくお願いいたします.

  • インスタンス?new?オブジェクト? の意味

    String [ ] sa = new String [3] ; この一文の意味が全くわかりません。 この時いったい何が起きているのでしょうか。 String 型 というのは特にサイズが決まっていませんよね。 C言語で int a[5];  なら aという名前で int型のサイズの分だけ5個メモリが確保された、という意味になりますね。 領域が確保できるのは、int型のサイズが決定しているからです。 では String [ ] sa = new String [3] ; は? new はいったい何をしているのか。 仮にメモリに何かをロードしているのなら何をロードしているのか。 そしてそのロードしたものの役割は何なのか。 よろしくおねがいします

    • ベストアンサー
    • Java
  • C#でウィンドウのアイコン取得する方法

    タスクマネージャのアプリケーションタブに 起動しているアプリケーション名とアイコンが一覧で表示されている部分のように 小さいアイコンを取得したいんですがなかなかうまくいきません。 ファイルに紐付くアイコンと解釈していただいても構いません。 とりあえず、下記のWin32 APIの処理を利用してみましたが SHGetFileInfoだけしかうまくいきませんでした。 しかし、SHGetFileInfoも、アイコンは取得できますがこれはファイルに紐付くアイコンではなく 実行体(EXE)に紐付くアイコンで表示されてしまいました。 開いているウィンドウ情報からだと実行プロセスのEXEのパスしか分からないからです。 ★質問★: ファイルに紐付く小さいアイコンの取得方法を教えてください!できればサンプルソース込みだと助かります。 #region 小さいアイコンを取得するためのWin32 API(ファイルパスから) // SHGetFileInfo関数 [DllImport("shell32.dll")] private static extern IntPtr SHGetFileInfo( string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); // SHGetFileInfo関数で使用するフラグ private const uint SHGFI_ICON = 0x100; // アイコン・リソースの取得 private const uint SHGFI_LARGEICON = 0x0; // 大きいアイコン private const uint SHGFI_SMALLICON = 0x1; // 小さいアイコン private const uint SHGFI_TYPENAME = 0x400;//ファイルの種類 // SHGetFileInfo関数で使用する構造体 private struct SHFILEINFO { public IntPtr hIcon; public IntPtr iIcon; public uint dwAttributes; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szDisplayName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName; }; #endregion #region 小さいアイコンを取得するためのWin32 API(ウィンドウハンドルからその1) [DllImport("user32.dll", EntryPoint = "GetClassLong")] public static extern IntPtr GetClassLongPtr32(IntPtr hWnd, int nIndex); [DllImport("user32.dll", EntryPoint = "GetClassLongPtr")] public static extern IntPtr GetClassLongPtr64(IntPtr hWnd, int nIndex); const int GCL_HICON = (-14); const int GCL_HICONSM = (-34); #endregion #region 小さいアイコンを取得するためのWin32 API(ウィンドウハンドルからその2) [DllImport("User32.dll", EntryPoint = "SendMessage")] public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); public const int WM_GETICON = 0x7F; public const int WM_SETICON = 0x80; public const int ICON_SMALL = 0; public const int ICON_BIG = 1; #endregion

  • excelで音声再生時に並行して別の操作をしたい

    下記のようなプログラムで音声再生をしていますが、再生が全部終了するまで別の操作ができません。再生と並行してスクロールなど別の操作もできるようにするにはどのように書き換えればよいでしょうか? Declare Function PlaySound Lib "Winmm.dll" Alias "PlaySoundA" _ (ByVal pszSound As String, _ ByVal hmod As Long, _ ByVal fdwSound As Long) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Const SND_ASYNC = &H1& '再生後すぐに制御を戻す Public Const SND_SYNC = &H0& '再生が完了するまで制御を戻さない Sub C列再生() EN = Range("A65536").End(xlUp).Row For I = 2 To EN INF = ThisWorkbook.Path & "\ONSEI-n\" & Range("C" & I).Value & ".WAV" PlaySound INF, 0, SND_SYNC '再生が完了するまで制御を戻さない Sleep 1000 '1000mS待ち Next I End Sub Sub A列再生() EN = Range("A65536").End(xlUp).Row For I = 2 To EN INF = ThisWorkbook.Path & "\ONSEI\" & Range("A" & I).Value & ".WAV" PlaySound INF, 0, SND_SYNC '再生が完了するまで制御を戻さない Sleep 1000 '1000mS待ち Next I End Sub

  • PlaySoundでSND_SYNC(同期)させると途中で音楽が止まります、、

    現在、特定のフォルダにある音楽(.wav)ファイルを検索して、パスを受け取り、それを順々に再生する、簡単な音楽再生プレイヤーを作成しようと思っています。 そこで問題となっているのが、同期を取るSND_SYNCなのですが、通常なら音楽が終了するまで待機するはずなのですが、 http://social.msdn.microsoft.com/forums/ja-JP/vsgeneralja/thread/4795014f-c428-43f1-a6b8-2267f26cde81 こちらにもあるとおり、途中で止まり、次の曲が再生されます。 そしてその曲も途中で止まり・・が続きます。 ASYNCにすると最後まで再生されるのですが、一番最後の曲のみ再生になります。 一応、応急処置として、ASYNCを宣言し、_getch();にて一時待たせていますが、 どうにかならないものでしょうか、、。もしかしたら音楽ファイルのサイズの問題かもしれませんが・・。 とりあえず検索は正常動作しているので、playsoundを行う関数は、 void prays(char *fname) {    printf("%sを再生します。\n",fname);    char T[100];    sprintf(T,"wavfile\\%s",fname);    PlaySound(T, NULL, SND_FILENAME| SND_ASYNC |SND_NOSTOP );//    _getch();    return ; } 環境 OS:winXP コンパイラ=BCC55(PSDK) 言語=C(メイン)、C++、WIN32API 回答お願いします。。

  • byte型をstring型として扱うには

    今日の質問/マイページに反映されないので、再度の質問です。 windows2000-sp4/vb6-sp5環境です。ユニコードのデータをvbで直接入出力し、vb内でstring型で扱いたいとおもっています。今のところ、vbの入出力では、自動的にsjis/unicode変換がされるので、binaryで受け取り、string型にするのかなと思っています。byte型で受け取り、APIの"MoveMemory"("RtlMoveMemory")でstring型にcopyするのかなとは思っているのですが、うまくいきません。経験不足そのものです。vbでのbyte型とstring型双方向のbinaryな変換の方法をお教えください。

  • メモリに読み込んだ音源のPlaySoundによる再生

    HANDLE fh,fh2; DWORD dummy,dummy2; case WM_CREATE: fh=CreateFile(TEXT("F:\\shot.wav"),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ fh2=CreateFile(TEXT("F:\\ENDING.WAV"),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ /* バッファ確保 */ lpSound = GlobalAlloc(GPTR,GetFileSize(fh,NULL)); lpSound2 = GlobalAlloc(GPTR,GetFileSize(fh2,NULL)); ReadFile(fh ,lpSound ,GetFileSize(fh ,NULL),&dummy ,NULL); /* 読み込み */ ReadFile(fh2,lpSound2,GetFileSize(fh2,NULL),&dummy2,NULL); /* 読み込み */ CloseHandle(fh); CloseHandle(fh2); として音源をメモリに読み込み、その後イベント発生時にPlaySound関数で音源をならしているのですが、 PlaySound(lpSound,NULL,SND_ASYNC|SND_MEMORY); 一番最初のイベント発生時に音源読み込みに時間が掛かり即座に鳴りません。次のイベント発生時は同時に鳴るのですが.... 一番最初から同時に鳴らすにはどのようにしたら良いでしょうか? 根本的にPlaySound関数では良くないのでしょうか? 御指導の程よろしくお願いします。