ISDN_Playwave hält WAV Datei fest

WinXP, IPS 2.3
Ich lasse über TTS_Generatefile eine wav Datei erzeugen und mittels ISDN_Playwave abspielen. Alles wunderbar und auch dokumentiert in dem „ISDN Modul benutzen“ Thread hier im Forum.

  $len=ISDN_PlayWave($isdn,$id, $dateiname);
  IPS_Sleep($len+200);
  ISDN_StopPlay($isdn , $id);
  ISDN_Disconnect($isdn,$id);
  unlink($dateiname);

Nur: Wenn die ISDN Verbindung unterbrochen wird, BEVOR die Wavedatei komplett abgespielt wurde, bleibt die WAV Datei als in Benutzung befindlich stehen. Das tritt z.B. auf, wenn der Angerufene vorher auflegt. Die Datei kann also nicht mehr gelöscht und folglich durch andere TTS_Generatefile auch nicht mehr benutzt werden. Alle Folgeoperationen schlagen dann fehl.
Wir kriege ich die durch ISDN_PlayWave festgehaltene Datei wieder frei?
IPS Service beenden und neu starten funktioniert zum löschen der Datei, ist aber nicht die wünschenswerte Lösung.

Habe genau das gleiche Problem. Dadurch wird das ISDN Module unbenutzbar da ich immer wieder falsche Ansagetext bekomme. Um die erzeugten (alten) WAV-Files zu löschen muß der IPS Server beendet und dann wieder neu gestartet werden … ist aber nicht wirklich ein praktikabler Workaround.

Hast Du hierzu schon eine Lösung gefunden???

Nein, nur eine Notlösung…
Ich verwende immer eine andere WAV-Datei (Dateiname per Zufallsgenerator oder aktueller Uhrzeit):


$dateiname='D:\speak'.time().'.wav';
TTS_GenerateFile(54855 /*[Alarmanlage\Text To Speech]*/,$text,$dateiname, 6);
$isdn=14940 /*[Alarmanlage\ISDN Module]*/;
$id = ISDN_Connect($isdn ,$nummer);
do {
    IPS_Sleep(500);
    $callinfo = ISDN_GetConnectionInfo($isdn, $id);
} while ( $callinfo["State"] != "4") ; // warten, bis abgenommen wurde; nach 30 Sekunden Timeout des PHP Skriptes
  IPS_Sleep(1000); //1 Sek. warten
  $len=ISDN_PlayWave($isdn,$id, $dateiname);
  IPS_Sleep($len+200);
  ISDN_StopPlay($isdn , $id);
  ISDN_Disconnect($isdn,$id);
  unlink($dateiname);

Womit ich noch ein Problem habe: Serialisieren bzw. begrenzen der Aufrufe.
Wenn meine Bewegungsmelder nachts ausgelöst werden (z.b. beim Test der Alarmanlage beim durchschreiten eines großen Raumes), dann triggert jeder Bewegungsmelder mehrfach das Meldeskript. Das feuert dann per php Mails/SMS raus und startet den Telefon-Anruf mit Meldung.
Einzeln funktioniert das einwandfrei. Aber wenn die Skripte alle in kurzer Folge und sogar parallel gestartet werden, dann verhakt sich das.
Ich brauche sowas wie Semaphore oder so. Etwas robustes ohne syncronisierende Datei/Variablenflags (die dann eventuell mal hängen bleiben und dauer-gesperrt sind etc.). Wenn jemand dafür eine Lösung hat wäre ich dankbar.

Gibt es als Standardfunktion im IPS:

IPS_SemaphoreEnter

und

IPS_SemaphoreLeave

Ralf,
vielen Dank. Cooler Hinweis!
Da werde ich mich mal reinlesen.