2012-03-14 16 views
0

さて、mciSendStringを使用してSOUNDクラスを作成しました。私はそれを使って、私が作っているRPGスタイルのゲームのための音楽やその他のサウンドファイルを再生しています。それは動作し、それはうまく動作します...しかし、。私の問題は、それが動作するためには、サウンドファイルの完全なパスが必要だということです(これが本当であるかどうかは分かりません)。 - 引用符をADDパスに .net mcisendstring - フルパスの代わりにリソースを使用する

  • ドットが(ドットのみをロードするための故障の原因となります

    • mcisendstringにスペース、スペースがクラッシュ(ファイルの読み込みに失敗)が発生します嫌い:ここ

      はmcisendstringのquerksの一部です

    • 非常に長いパスは読み込みに失敗します(許容最大文字数は255)
    • 相対パスは読み込みに失敗します...(chicken.mp3のようなものは使用できません...使用する必要がありますC:\ chicken.mp3)
    • 繰り返し= trueの

    は私のリソースにファイルを追加しようとしたリソースへのパスを設定しようとした場合個の

  • .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 = "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を使用しており、NuGetのBizArk Coreも持っています。だから私がこれらのどちらかを使うことができるなら、どうすれば私がやるべきことをするためにこれらのどちらを使うことができるか教えてください。助けを前にありがとう。

  • +0

    これはmciSendStringでは不可能です。しかし確かにXNAで可能です:http://msdn.microsoft.com/en-us/library/bb195053.aspx –

    +0

    さて、私はページを見ましたが、それは私を助けるものではありません。どのように私はこれを行うに行くだろう。ネット(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) 
    
    関連する問題