2012-03-14 11 views
0

좋아요. 그래서 mciSendString을 사용하여 SOUND 클래스를 만들었습니다. 나는 그것을 만들고있는 RPG 스타일 게임을 위해 음악과 다른 사운드 파일을 재생하는 데 사용하고 있습니다. 그것은 효과가 있고 잘 작동하지만 .... 내 문제는 제대로 작동하는지 확인하기 위해 사운드 파일의 전체 경로가 필요하다는 것입니다. 여기 .net mcisendstring - 전체 경로 대신 리소스 사용

이 mcisendstring의 querks의 일부입니다 :

  • 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 
    

    최종 클래스 내가 무엇이 필요

    : 나는 어떻게 든을 얻을 필요가

    • . mp3 파일을 경로로 사용할 수있는 리소스로 사용하거나 이러한 파일을 루트 드라이브 나 일부에 두는 대신 다른 방법이 필요합니다. 다른 전체 컴퓨터 경로입니다.

    뭔가 예 내가 필요해 내가 소리를 재생하는 방법

    Select Case id 
    
          Case 0 'Game Over 
    
           path = My.Resources.FinalFantasyAdventure_Mission 
    End Select 
    

    변경

    Select Case id 
    
          Case 0 'Game Over 
    
           path = "C:\FinalFantasy7-SendaDreamIntoTheUniverse.mp3" 
    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. 내 프로젝트에서 XNA Graphics를 사용하고 있으며 NuGet의 BizArk Core도 가지고 있습니다. 그래서 내가이 중 하나를 사용할 수 있다면, 내가해야 할 일을하기 위해이 중 하나를 어떻게 사용할 수 있는지 말해주십시오. 모든 도움을 미리 감사드립니다.

  • +0

    mciSendString에서는이 작업을 수행 할 수 없습니다. 그러나 확실히 XNA를 사용하여 가능합니다. http://msdn.microsoft.com/en-us/library/bb195053.aspx –

    +0

    좋아요, 페이지를 보았지만, 그것이 나에게 도움이되지는 않았습니다. 어떻게 내가 .net (C# 또는 C++이 아닙니다) –

    답변

    0

    나는 이것이 매우 오래된 스레드라는 것을 알고 있지만, 누군가에게 도움이된다면, 여기 해결책이 있습니다.

    당신은 당신이 VB에서

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

    를 사용할 수있는 전체 경로를 사용해야하지만 자원이 /projectfolder/resources/에 저장됩니다 가정합니다.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)