Winsound ohne Warten auf Liedende ausführen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
b@n@ne
User
Beiträge: 2
Registriert: Donnerstag 29. Oktober 2009, 18:07

Hallo,
ich habe mich heute zum ersten Mal mit der Programmiersprache python beschäftigt. An die Serielle Schnittstelle des PCs sende ich mit einem Arduinoboard in unregelmäßigen Zeitabständen "1" und "2", welche ich mit einem python-Programm verarbeiten will. Bei einer "1" soll Lied "eins.wav" bei einer "2" Lied "zwei.wav" abgespielt werden. Bisher bin ich zu folgendem Code gekommen:

Code: Alles auswählen

import serial
import winsound
ser = serial.Serial('COM4', 9600)
while 1:
  num = ser.read()
  print num
  if num=="1":
    winsound.PlaySound("C:\zwei.wav", winsound.SND_ALIAS)
  if num=="2":
    winsound.PlaySound("C:\eins.wav", winsound.SND_ALIAS)
Das Problem besteht nun darin, dass die Liedlänge manchmal länger ist, als der Abstand zwischen den Einsen und Zweien. Ist es möglich die Schleife weiter auszuführen, auch wenn das Lied noch nicht zu Ende ist?

Michael
BlackJack

@b@n@ne: Jup das ist möglich, dazu ist das SND_ASYNC-Flag da. Bist Du sicher, dass Du `SND_ALIAS` verwenden wilst!?

Sonstige Anmerkungen: Es gibt `True` und `False`, die sollte man auch verwenden wenn man Wahrheitswerte meint. Statt Zahlen.

Einrückung ist in Python üblicherweise vier Leerzeichen pro Ebene.

Bei literalen Zeichenketten mit \ drin sollte man "raw"-Zeichenketten verwenden, sonst stolpert man früher oder später über Escape-Sequenzen wie in 'c:\temp', was kein T enthält, sondern ein Tabulatorzeichen.

Wenn sich nur die Dateinamen in Abhängigkeit von den empfangenen Bytes ändern, könnte man das auch über ein Dictionary lösen. Bei zwei verschiedenen Möglichkeiten könnte man auch bei ``if``\s bleiben, aber wenn's mehr wird, ist ein Dictionary flexibler und einfacher zu erweitern.

Code: Alles auswählen

import winsound
import serial

port = serial.Serial('COM4', 9600)
while True:
    number = port.read()
    print number
    number2filename = {'1': r'C:\eins.wav',
                       '2': r'C:\zwei.wav'}
    filename = number2filename.get(number)
    if filename:
        winsound.PlaySound(filename,
                           winsound.SND_FILENAME | winsound.SND_ASYNC)
b@n@ne
User
Beiträge: 2
Registriert: Donnerstag 29. Oktober 2009, 18:07

Vielen Danke für Hilfe. Damit hat es geklappt. Ich muss mich wohl noch etwas mit Python beschäftigen um selber drauf zukommen. PHP z.B. ist doch leider sehr anders.
Antworten