.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 находит его сам.

Другие вопросы по тегам