Parallele Sprachausgabe

Hallo,

ich habe mir eine Funktion geschrieben um in einzelnen Räumen eine Sprachausgabe zu machen. Wenn ich meiner Funktion statt eines Raumnamens ein „*“ übergebe, dann wird es nach und nach in allen Räumen ausgegeben.

Gibt es eine Möglichkeit WAC_PlayFile im Hintergrund auszuführen?
Mit IPS_Execute habe ich da keine Möglichkeit gesehen.

Dann könnten (fast) alle Räume wirklich parallel besprochen werden.

Gruß
Thorsten

Beispiel für sechs gleichzeitige Aufrtufe:


IPS_RunScriptEx($id_script_sprachausgabe_sk1, array("ansagetext" => $ansagetext));
IPS_RunScriptEx($id_script_sprachausgabe_sk2, array("ansagetext" => $ansagetext));
IPS_RunScriptEx($id_script_sprachausgabe_sk3, array("ansagetext" => $ansagetext));
IPS_RunScriptEx($id_script_sprachausgabe_sk4, array("ansagetext" => $ansagetext));
IPS_RunScriptEx($id_script_sprachausgabe_sk5, array("ansagetext" => $ansagetext));
IPS_RunScriptEx($id_script_sprachausgabe_sk6, array("ansagetext" => $ansagetext));

Hier ein Beispiel für den Aufruf:


include(IPS_GetKernelDir()."scripts\Konstanten.ips.php");
TTS_Play(1,$ansagetext,"",2);

Dazu habe ich diese Funktion geschrieben:

Hallo Thomas,

deinen Beitrag hatte ich schon gesehen, aber zu dem Zeitpunkt hatte ich bereits eine eigene Funktion und die wollte ich nicht unbedingt ersetzen :D.

function TM_Sprich($Raum,$Text,$Alarm)
{
	/*
		Folgende Räume sind möglich:
	   - Bad
	   - Wohnzimmer
	   - Schlafzimmer
	   - * (gibt den Text in allen Räumen wieder, die für Sprachausgabe aktiviert sind.
		- Kommagetrennte Kombinationen sind möglich (Bad, Wohnzimmer)

		Vor einer Ansage wird geprüft, ob der entsprechende Lautsprecher Strom hat und ggf. wird er eingeschaltet.
		Sollte Musik laufen, so wird die Musik angehalten und nach der Ansage wieder fortgesetzt.
	*/

	$Lautstaerke = GetValue(22528 /*[Einstellungen\Sprachausgabe\Lautstärke für Sprachansagen]*/);

	// Wenn Parameter "Alarm" nicht übergeben wird, dann wird von keinem Alarm ausgegangen.
	if($Alarm == 1)
	{
		$Lautstaerke = 100;
	} else {
	   $Alarm = 0;
	}

	$Raum_Orig = $Raum;

	if($Raum == '*')
	   $Raum = "Wohnzimmer,Bad,Schlafzimmer";

	$tmp1 = preg_split("/,/",$Raum);

	foreach($tmp1 as $raum)
	{
	   $tmp2 = 99;
		$tmp3 = 99;
		switch($raum)
	   {
		   case "Bad":
				// Prüfen, ob im Schlafzimmer Sprachausgabe gewünscht ist
				if((GetValue(20971 /*[Einstellungen\Sprachausgabe\Bad]*/) == true) or ($Alarm == 1))
				{
				   //Entweder Sprachausgabe im Schlafzimmer ist aktiviert oder das "Alarm" Flag wurde gesetzt und somit auch Sprachausgabe wenn nicht gewünscht!
					// Die Lautstärke des MediaPlayers ermitteln und speichern (falls Musik läuft soll die Lautstärke nach der Ansage wiederhergestellt werden)
					$tmp3 = GetValue(54768 /*[Wohnung\Bad\Musik\Lautstärke]*/);
					WAC_SetVolume(29857 /*[Wohnung\Bad\Musik]*/,0);
					// Prüfen, ob der Lautsprecher Strom hat
					if(GetValue(20356 /*[Wohnung\Bad\Strom für Lautsprecher\Status]*/) == FALSE)
					{
					   $tmp2 = 0;
					   HM_WriteValueBoolean(25474 /*[Wohnung\Bad\Strom für Lautsprecher]*/,"STATE",TRUE);
					}

					WAC_SetVolume(31892 /*[Wohnung\Bad\MP Sprachausgabe]*/,$Lautstaerke);
					$tmp_Datei = IPS_GetKernelDir() . "/Media/" . rand() . ".wav";
					TTS_GenerateFile(36830 /*[Wohnung\Bad\Sprachausgabe]*/,$Text,$tmp_Datei,35);
					WAC_PlayFile(31892 /*[Wohnung\Bad\MP Sprachausgabe]*/,$tmp_Datei);
					IPS_Sleep(1000);
					$tmp4 = GetValue(47391 /*[Wohnung\Bad\MP Sprachausgabe\Status]*/);
					while($tmp4 == 1)
					{
					   IPS_Sleep(1000);
						$tmp4 = GetValue(47391 /*[Wohnung\Bad\MP Sprachausgabe\Status]*/);
					}

					if($tmp2 == 0)
					{
					   // Der Lautsprecher war vor der Ansage aus. Also jetzt wieder abschalten.
					   HM_WriteValueBoolean(25474 /*[Wohnung\Bad\Strom für Lautsprecher]*/,"STATE",FALSE);
					}
					// Sicherheitshalber die Lautstärke des MediaPlayers wiederherstellen (falls Musik lief)
					WAC_SetVolume(29857 /*[Wohnung\Bad\Musik]*/,$tmp3);
					unlink($tmp_Datei);
				}
	      break;

		   case "Wohnzimmer":
				if((GetValue(53387 /*[Einstellungen\Sprachausgabe\Wohnzimmer]*/) == true) or ($Alarm == 1))
				{
				 	$tmp3 = GetValue(24711 /*[Wohnung\Wohnzimmer\Musik\Lautstärke]*/);
					WAC_SetVolume(21238 /*[Wohnung\Wohnzimmer\Musik]*/,0);
					if(GetValue(23439 /*[Wohnung\Wohnzimmer\Strom Lautsprecher\STATE]*/) == FALSE)
					{
					   $tmp2 = 0;
					   HM_WriteValueBoolean(59524 /*[Wohnung\Wohnzimmer\Strom Lautsprecher]*/,"STATE",TRUE);
					}

					WAC_SetVolume(58689 /*[Wohnung\Wohnzimmer\MP Sprachausgabe]*/,$Lautstaerke);
					$tmp_Datei = IPS_GetKernelDir() . "/Media/" . rand() . ".wav";
					TTS_GenerateFile(52352 /*[Wohnung\Wohnzimmer\Sprachausgabe]*/,$Text,$tmp_Datei,35);
					WAC_PlayFile(58689 /*[Wohnung\Wohnzimmer\MP Sprachausgabe]*/,$tmp_Datei);
					IPS_Sleep(1000);
					$tmp4 = GetValue(50132 /*[Wohnung\Wohnzimmer\MP Sprachausgabe\Status]*/);
					while($tmp4 == 1)
					{
					   IPS_Sleep(1000);
						$tmp4 = GetValue(50132 /*[Wohnung\Wohnzimmer\MP Sprachausgabe\Status]*/);
					}

					if($tmp2 == 0)
					{
					   HM_WriteValueBoolean(59524 /*[Wohnung\Wohnzimmer\Strom Lautsprecher]*/,"STATE",FALSE);
					}
					WAC_SetVolume(21238 /*[Wohnung\Wohnzimmer\Musik]*/,$tmp3);
					unlink($tmp_Datei);
				}
	      break;

	      case "Schlafzimmer":
				if((GetValue(21287 /*[Einstellungen\Sprachausgabe\Schlafzimmer]*/) == true) or ($Alarm == 1))
				{
					// Dieser Teil muss noch auf die neue Logik umgestellt werden!
					$tmp3 = GetValue(31030 /*[Wohnung\Schlafzimmer\Musik\Lautstärke]*/);
					WAC_SetVolume(53025 /*[Wohnung\Schlafzimmer\Musik]*/,0);
					TTS_Speak(47570 /*[Wohnung\Schlafzimmer\Sprachausgabe]*/,$Text,TRUE);
				}
	      break;
		}
	}
}

Meine Funktion rufe ich beispielsweise so auf:

TM_Sprich('*','Das ist eine Ansage die kein Alarm ist und auf allen Räumen ausgegeben wird.',0);

Der Stern wird dann im Script durch „Wohnzimmer,Bad,Schlafzimmer“ ersetzt, dann läuft die Logik 3 Mal und führt die für jeden Raum passende Logik aus.

Aber sobald er an die Stelle „WAC_PlayFile“ kommt wartet das Script bis der Befehl beendet ist und geht dann erst weiter zum nächsten Raum.

Kann ich irgendwie bewirken, dass er WAC_PlayFile aufruft und dann mit der Scriptbearbeitung direkt weiter macht ohne auf Beendigung von WAC_PlayFile zu warten?

Gruß
Thorsten

Deshalb habe ich die Logik mit den gestaffelten IPS_RunScriptEx gemacht. Diese laufen parallel.