Kleiner Fehler in _SoundOpen

  • Hallo,
    ich habe ewig gesucht, was ich falsch mache und habe dann herausgefunden, dass ich es mal nicht bin :S .

    Spoiler anzeigen
    [autoit]

    #include <Sound.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)
    Opt("WinTitleMatchMode", 2)

    [/autoit] [autoit][/autoit] [autoit]

    If $cmdline[1] = "-play" Then
    Play()
    ElseIf $cmdline[1] = "-neu" Then
    Run("C:\Program Files (x86)\AutoIt\Aut2Exe\Aut2exe_x64.exe /in " & @ScriptName & " /out C:\Programme\SpeedCommander\Awf\fuer_sc.exe"); /comp 4 /x64 /icon C:\ProgramData\Icons\buttons\01\restart_black_01.ico")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func Play()
    Local $Sound, $HalbeLaenge

    ; Sounddatei öffnen
    $Sound = _SoundOpen("E:\Audio\Ayreon\Theory Of Everything, The\Disc01\Ayreon! Theory Of Everything, The - 2013 - Hard Rock _21 !Alive!.wav")
    ;$Sound = _SoundOpen("E:\Audio\Ayreon\Theory Of Everything, The\Disc01\Ayreon! Theory Of Everything, The - 2013 - Hard Rock _02 !Theory Of Everything Part 1, The.wav")
    ; Mitte der Liedlänge ermitteln, die ", 2" ermittelt in Millisekunden
    $HalbeLaenge = ((_SoundLength($Sound, 2)) / 2)
    MsgBox(0, "", $Sound[0])
    ;Run("C:\Programme\MediaPlayerClassic\mpc-hc64.exe " & '"' & $cmdline[2] & '" /start "' & $HalbeLaenge & '" /fixedsize 2143, 154"')

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]


    Öffnet man die Datei in Zeile 18, ist alles in Ordnung.
    Nimmt man stattdessen Zeile 19 kommt eine Fehlermeldung.
    Grund ist offenbar, dass _SoundOpen mit einem Dateipfad von mehr als 127 Zeichen nicht zurechtkommt.
    Kann ich das selbst irgendwie "ausmerzen" und wenn ja wie?

  • Kann nur bestätigen was Oscar sagt Bei mir funktioniert es mit weit längeren Pfaden

    Bsp:

    Spoiler anzeigen
    [autoit]

    #include <Sound.au3>
    #include <MsgBoxConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $aSound = _SoundOpen("C:\Users\Public\Music\Sample Music\testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttes\Ayreon! Theory Of Everything, The - 2013 - Hard Rock _02 !Theory Of Everything Part 1, The.mp3")
    _SoundPlay($aSound)
    If @error = 2 Then
    MsgBox($MB_SYSTEMMODAL, "Error", "The file does not exist")
    Exit
    ElseIf @extended <> 0 Then
    Local $iExtended = @extended ; Assign because @extended will be set after DllCall.
    Local $tText = DllStructCreate("char[128]")
    DllCall("winmm.dll", "short", "mciGetErrorStringA", "str", $iExtended, "ptr", DllStructGetPtr($tText), "int", 128)
    MsgBox($MB_SYSTEMMODAL, "Error", "The open failed." & @CRLF & "Error Number: " & $iExtended & @CRLF & "Error Description: " & DllStructGetData($tText, 1) & @CRLF & "Please Note: The sound may still play correctly.")
    Else
    MsgBox($MB_SYSTEMMODAL, "Success", "The file opened successfully")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _SoundClose($aSound)

    [/autoit]

    Das funzt einwandfrei

    Dieser Beitrag wurde 9521 mal editiert, zum letzten Mal von Blubkuh: Morgen, 02:28.

    [autoit]

    If Not $Elephant Then $Irelephant = True

    [/autoit]
  • Ich würde mal sagen du solltest zunächst vernünftig Debuggen um den Fehler besser einzugrenzen bzw. sauber Programmieren und Fehler abfangen, damit es nicht zu kompletten Scriptabstürzen wie im Screenshot kommen kann:

    Spoiler anzeigen
    [autoit]

    #include <Sound.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)
    Opt("WinTitleMatchMode", 2)

    [/autoit] [autoit][/autoit] [autoit]

    If $cmdline[1] = "-play" Then
    Play()
    ElseIf $cmdline[1] = "-neu" Then
    Run("C:\Program Files (x86)\AutoIt\Aut2Exe\Aut2exe_x64.exe /in " & @ScriptName & " /out C:\Programme\SpeedCommander\Awf\fuer_sc.exe"); /comp 4 /x64 /icon C:\ProgramData\Icons\buttons\01\restart_black_01.ico")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func Play()
    Local $Sound, $HalbeLaenge

    ; Sounddatei öffnen
    $Sound = _SoundOpen("E:\Audio\Ayreon\Theory Of Everything, The\Disc01\Ayreon! Theory Of Everything, The - 2013 - Hard Rock _21 !Alive!.wav")
    ;$Sound = _SoundOpen("E:\Audio\Ayreon\Theory Of Everything, The\Disc01\Ayreon! Theory Of Everything, The - 2013 - Hard Rock _02 !Theory Of Everything Part 1, The.wav")

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    Die Hilfe sagt:

    [/autoit] [autoit][/autoit] [autoit]

    Erfolg: Gibt ein 4-Elemente Array welches folgende Informationen enthält zurück:
    $array[0] = ID-String der Sounddatei
    $array[1] = VBR Länge Korrekturfaktor
    $array[2] = VBR Zeit Korrekturfaktor
    $array[3] = Sound ID Marker
    Fehler: 0 und setzt @error
    @Error: 1 = MCI Fehler beim öffnen
    2 = Datei existiert nicht
    @Extended: 0 = Kein Fehler
    Integer anders als 0 = MCI Error
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    $debug = "Errorcode: " & @error & " / Extended: " & @extended

    [/autoit] [autoit][/autoit] [autoit]

    if not isarray($Sound) then
    msgbox(0,"Fehler beim Öffnen der Audiodatei", $debug)
    else
    ; Mitte der Liedlänge ermitteln, die ", 2" ermittelt in Millisekunden
    $HalbeLaenge = ((_SoundLength($Sound, 2)) / 2)
    MsgBox(0, "", $Sound[0])
    ;Run("C:\Programme\MediaPlayerClassic\mpc-hc64.exe " & '"' & $cmdline[2] & '" /start "' & $HalbeLaenge & '" /fixedsize 2143, 154"')
    endif
    EndFunc

    [/autoit]

    Mit dem Errorcode kannst du dann zumindestens mit Sicherheit sagen ob es ein MCI Fehler (was auch immer das sein mag...) oder ein Problem beim Auffinden der Datei ist. Sollte letzteres zutreffen liegt vermutlich wirklich ein Problem mit dem Pfad, dem Dateinamen oder den Zugriffsrechten des Benutzeraccounts vor. Hier wäre dann vielleicht im Vorfeld auch der Einsatz von

    [autoit]

    fileexists()

    [/autoit]

    sinnvoll um spätere Fehler erst garnicht entstehen zu lassen.

    Was den potentiellen MCI Fehler anbelangt hilft evtl. ein Blick in die verwendete UDF Funktion oder google (ich vermute dieser Fehler deutet auf ein Problem mit der Datei oder dem Dateiformat ansich hin). WAV ist nicht immer gleich WAV, es gibt die unterschiedlichsten Codierungen für wav Dateien. Möglicherweise werden nicht alle Arten von _soundopen() unterstützt.

  • Oscar : Sowohl die 3.3.10 als auch die Beta, gleiches Ergebnis.

    misterspeed: Das Debuggen ergab, dass der Treiber nicht geladen werden kann (@Extended 10 = MCI-Code 266)

    Als Ergebnis liegt also bisher folgendes vor:
    E:\MehrAls127Zeichen\test.mp3 > funktioniert
    E:\Maximal127Zeichen\test.wav > funktioniert
    E:\MehrAls127Zeichen\test.wav > funktioniert nicht
    Zeichenanzahl jeweils inklusive Dateiname(test.wav/mp3)

    Und nu sprach Zeus?

    • Offizieller Beitrag

    Was ist denn das für ein Merkwürdiger Pfad, der Komma und Ausrufezeichen enthällt? :pinch:

  • Oscar : Ja hatte ich auch schon, geht auch nicht.

    Raupi : Auch wenn deine Frage nutzlos ist und dich das eigentlich auch nix angeht. Die Dateien werden beim Rippen mit Absicht so erstellt damit das Programm mp3Tag direkt aus dem Dateinamen die Tags bilden kann.