.net mcisendstring - использование ресурсов вместо полных путей
Итак, я создал класс SOUND, используя mciSendString. Я использую его для воспроизведения музыки и других звуковых файлов для создаваемой мной игры в стиле RPG. Это работает, и это работает хорошо... однако. Моя проблема в том, что ему нужен полный путь к звуковому файлу, чтобы он работал (не уверен, что это правда).
Вот некоторые из особенностей mcisendstring:
- mcisendstring Ненавидит пробелы, пробелы будут вызывать сбой (сбой при загрузке файла) - ДОБАВИТЬ ЦИТАТЫ
- Точки в пути могут вызвать сбой загрузки (только точка должна быть для расширения)
- Очень длинные пути вызовут сбой при загрузке (максимально допустимое количество символов - 255)
- Relative paths will cause failure to load...(cannot use something like chicken.mp3... must use C:\chicken.mp3)
- .wav files will fail to load if repeat = true
I tried adding the files to my resources and tried setting the path to the resource, however it said: 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
Конечный класс
Что мне нужно:
- I need to somehow get the.mp3 files as a resource usable for the path's or I need some other means instead of having these files be in the root drive or some other full computer path.
EXAMPLE OF SOMETHING I NEED
+ Изменить
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
How I play the sound:
(on another test form)
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
PS I am using XNA Graphics in my project and I also have NuGet's BizArk Core. So if I can use either of these then please tell me how I can use either of these to do what i need to do. Заранее благодарю за любую помощь.
2 ответа
Как уже упоминалось выше, это старая ветка, но я думаю, что в 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
Будьте осторожны, переменная Resource в приведенном выше коде - это фактически имя ресурса, а не сам ресурс. Таким образом, вы получите ошибку, если попытаетесь сделать следующее:
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)
Я знаю, что это супер старая тема, но если она кому-нибудь поможет, вот решение.
Вам придется использовать полный путь, но при условии, что ваши ресурсы хранятся в /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 находит его сам.