0

Итак, я создал класс SOUND с помощью mciSendString. Я использую его для воспроизведения музыки и других звуковых файлов для игры в стиле RPG, которую я делаю. Он работает, и он работает хорошо ... однако. Моя проблема заключается в том, что для полного функционирования этого файла требуется полный путь к звуковому файлу (не уверен, что это правда)..net mcisendstring - использование ресурсов вместо полных путей

Вот некоторые из querks из mcisendstring:

  • mcisendstring Ненавидит пространства, пространства вызовет сбой (сбой загрузки файла) - КАВЫЧКИ
  • Многоточие в пути может вызвать сбой загрузки (только точка должен быть для расширения)
  • Очень длинные пути вызовут сбой при загрузке (Макс. допустимые символы - 255)
  • Относительные пути вызовут сбой при загрузке ... (не может использовать что-то вроде chicken.mp3 ... необходимо использовать C: \ chicken.mp3)
  • .wav файлы не загружаются, если повтор = верно

Я попытался добавить файлы к моим ресурсам и попытался установить путь к ресурсу, однако он сказал: Value of type '1-dimensional array of Byte' cannot be converted to 'String'.

Любая помощь очень ценится :)

Вот мой код:

Public Class SOUND 

Public 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 
'Command String VERY IMPORTANT 

Private oName As String = Nothing 

Public Property Name As String 
    Set(value As String) 
     oName = value 
    End Set 
    Get 
     Return oName 
    End Get 
End Property 

Public Sub Play(ByVal id As Integer, ByVal repeat As Boolean, Optional volume As Integer = 1000) 

    If repeat = True Then 

     mciSendString("Open " & GetFile(id) & " alias " & oName, CStr(0), 0, 0) 'Open the file 
     mciSendString("play " & oName & " repeat ", CStr(0), 0, 0) 'then play with repeating value 

    Else 

     mciSendString("Open " & GetFile(id) & " alias " & oName, CStr(0), 0, 0) 
     mciSendString("play " & oName, CStr(0), 0, 0) 

    End If 

    'Optionally Set Volume 
    mciSendString("setaudio " & oName & " volume to " & volume, CStr(0), 0, 0) 

End Sub 

Public Sub Kill(ByVal song As String) 

    mciSendString("close " & song, CStr(0), 0, 0) 
    oName = Nothing 

End Sub 

' Media Library 
Private Function GetFile(ByVal id As Integer) As String 

    Dim path As String = "" 

    'mcisendstring Hates spaces, spaces will cause crash (failure to load file) - ADD QUOTES 
    'Dots in path can cause failure to load (only dot should be for the extention) 
    'Very Long Paths will cause failure to load (Max Characters allowed is 255) 
    'Relative paths will cause failure to load...(cannot use something like chicken.mp3 ... must use ex:[C:\chicken.mp3]) 
    '.wav files will fail to load if repeat = true 

    Select Case id 

     Case 0 'Game Over 

      path = "C:\FinalFantasy7-SendaDreamIntoTheUniverse.mp3" 

     Case 1 'Battle Sequence 

      path = "C:\FinalFantasyTactics-Garland_Magic.mp3" 

     Case 2 'Battle Victory 

      path = "C:\FinalFantasyLegend2-Victory.mp3" 

     Case 3 'Mission Time 

      path = "C:\FinalFantasyAdventure-Mission.mp3" 

    End Select 

    path = Chr(34) & path & Chr(34) 
    'Chr(34) is quotes...cannot just use "" because it will think that it is part of the string/path itself. 


    Return path 
End Function 

End Class

Что мне нужно:

  • мне нужно как-то получить. mp3-файлы в качестве ресурса, который можно использовать для пути, или мне нужны другие средства вместо того, чтобы эти файлы находились в корневом диске или другой полный путь к компьютеру.

пример того, что я НУЖНА

Изменить

Select Case id 

      Case 0 'Game Over 

       path = "C:\FinalFantasy7-SendaDreamIntoTheUniverse.mp3" 
End Select 

в

Select Case id 

      Case 0 'Game Over 

       path = My.Resources.FinalFantasyAdventure_Mission 
End Select 

Как играть звук:

(на другой тестовой форме)

Dim intSound As Integer = 0 
Dim snd As New SOUND 'SOUND is the sound class with mcisendstring 

Private Sub PlaySoundBtn_Click(sender As System.Object, e As System.EventArgs) Handles PlaySoundBtn.Click 

    intSound += 1 

    With snd 
     .Name = "SOUND" & intSound 'SOUND is the alias along with the number (this one is SOUND1) 
     .Play(3, True, 500) 
     '3 is the song ID, True is for the repeat, 500 is for the optional volume (Max = 1000) 
    End With 

End Sub 

P.S. Я использую XNA Graphics в своем проекте, и у меня также есть Bizark Core от NuGet. Поэтому, если я могу использовать любой из них, пожалуйста, скажите мне, как я могу использовать любой из них, чтобы делать то, что мне нужно делать. Заранее благодарю за любую помощь.

+0

это невозможно с помощью mciSendString. Но, конечно же, возможно с XNA: http://msdn.microsoft.com/en-us/library/bb195053.aspx –

+0

Хорошо, я посмотрел на страницу, однако это не помогло мне вообще. Как бы я мог сделать это в .net (Not C# или C++) –

ответ

0

Я знаю, что это супер-старая нить, но если это кому-то поможет, вот решение.

Вы должны будете использовать полный путь, но при условии, ваши ресурсы хранятся в /projectfolder/resources/ вы можете использовать

Dim filePath As String = Chr(34) & Application.StartupPath & "/../../Resources/myMusic.mp3" & Chr(34) 
mciSendString("open " & filePath & " alias myMusic", CStr(0), 0, 0) 

В VB.NET, Application.StartupPath - это полный путь к папке, в которой хранится .exe. Обычно это path/projectfolder/bin/debug/ или path/projectfolder/bin/release/. Добавив /../../resources/, вы получите /projectfolder/resources/, что позволит вам не знать полный путь к вашей папке, так как VB.NET находит это сам.

0

Как упоминалось выше, это старая нить, но я полагаю, что с Google все равно найдутся люди (как и я сегодня).

Просто дополнительное предложение, иногда у вас не будет вашего аудиофайла в выходной директории или вы можете распространять автономный исполняемый файл. Существует также риск того, что файл можно удалить из выходного каталога, и это удобно для его воссоздания. Кроме того, наличие ресурса как части исполняемого файла и в выходном каталоге занимает больше места, чем просто его выполнение как часть исполняемого файла, поэтому иногда стоит временно хранить файл на диске (и удалять его позже), а не чтобы иметь постоянную копию там, чтобы вы могли получить к ней доступ.

В этих случаях полезно иметь возможность извлекать файл из ресурсов во время выполнения и сохранять его на диске где-нибудь, к которому вы можете получить доступ (возможно, временное расположение файла, если вы хотите его удалить позже).

Ниже очень простой код может сделать:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 

    SaveResourceObject("FinalFantasyAdventure_Mission", "C:\FinalFantasyAdventure_Mission.mp3") 

End Sub 

Sub SaveResourceObject(Resource as String, FileName as String) 
    Dim myMemStream As New System.IO.MemoryStream 
    My.Resources.ResourceManager.GetObject(Resource).CopyTo(myMemStream) 
    Dim myBytes() As Byte = myMemStream.ToArray 
    My.Computer.FileSystem.WriteAllBytes(FileName, myBytes, False) 
End Sub 

Будьте осторожны, переменная ресурса в приведенном выше коде на самом деле имя ресурса, а не сам ресурс. Таким образом, вы получите сообщение об ошибке, если вы пытаетесь сделать следующее:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
    SaveResourceObject(My.Resources.FinalFantasyAdventure_Mission, "C:\FinalFantasyAdventure_Mission.mp3") 
End Sub 

Вы можете изменить код достаточно легко принять фактический ресурс в качестве параметра, если вы предпочитаете.

Заметьте, я использовал «C: \» в приведенном выше примере, но я бы рекомендовал создать свою собственную папку в папке данных приложения, которые вы можете найти с помощью:

Dim AppDataPath as String = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData) 

Или, просто если вы импортировали System.Environment:

Dim AppDataPath as String = GetFolderPath(SpecialFolder.ApplicationData)