2013-05-20 2 views
0

Я работаю над программой на Visual Basic 2008, я должен иметь разные типы звуков с различными томами. Следовательно, My.Computer.Audio.Play не является допустимым вариантом.mciSendString/winmm.dll - Воспроизведение аудиофайла

я решил использовать mciSendString вместо и нашел следующий код

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _ 
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _ 
ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer 

    mciSendString("close myWAV", Nothing, 0, 0) 
    Dim fileName1 As String = 
    mciSendString("open " & fileName1 & " type mpegvideo alias myWAV", Nothing, 0, 0) 
    mciSendString("play myWAV", Nothing, 0, 0) 

    'min Volume is 1, max Volume is 1000 
    Dim Volume As Integer = (SFXVolume * 100) 
    mciSendString("setaudio myWAV volume to " & Volume, Nothing, 0, 0) 

Теперь этот код я проверил и работает отлично, когда filename1 = «C: //Correct.wav»

Однако когда Я использую

filename1 = My.Application.Info.DirectoryPath & "\ Correct.wav"

я не получаю воспроизведения звука WHATS Oever.

Может ли кто-нибудь помочь мне исправить мой код, чтобы это сработало. Спасибо заранее.

+0

Вы игнорируете возвращаемое значение mciSendString(). Плохая идея, вот как она сообщает вам, что функция не удалась. Поэтому вы не знаете, почему это не работает, потому что вы не проверяете наличие сбоя. –

ответ

1

Если DirectoryPath имеет пространства, то mciSendString не сможет точно распознать команду, вы должны окружать путь в кавычки:

mciSendString(
    String.Format("open ""{0}"" type mpegvideo alias myWAV", fileName1), Nothing, 0, 0) 

Не забудьте проверить возвращаемый статус, а, как говорит Ханс ,

Кроме того, так как вы не знаете, есть ли DirectoryPath обратного косой черты или нет, точный способ произвести полный путь от каталога и названия:

fileName1 = System.IO.Path.Combine(My.Application.Info.DirectoryPath, "Correct.wav") 
0

Вы должны использовать DLL вызов GetShortPathName в для передачи файлов в WINMM.DLL. lpszLongPath - это ваша полная строка пути, а короткое имя пути будет передано lpszShortPath. cchbuffer действительно должен быть установлен на 200 или около того, хотя в большинстве случаев возвращаемая строка будет намного короче. Вы должны использовать дополненную строку VB.

Private Declare Function GetShortPathName Lib "kernel32" Alias ​​"GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long

Я только использовал mciSendString звонки в пакете миди программа чтения файлов, открытие 3642 файлов midi и верное копирование авторских прав, заголовков и продолжительности воспроизведения на самом деле довольно быстро!

С наилучшими пожеланиями David R Лич

1

Используйте Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long затем SetCurrentDirectory filepath перед открытием файла для воспроизведения. Это работает для меня.

Смежные вопросы