Hallo zusammen,
ich braeuchte wieder einmal eure Hilfe.
Viele von euch kennen sicher das Beispielprogramm "Netradio", welches bei den BASS Komponenten mitgeliefert wird.
Ich habe den Teil, welcher zum Abspielen eines Internet-Radiosenders dient, in mein Programm mit eingebaut.
Soweit ich dies nun beurteilen kann, laeuft dieser Teil als ein eigenstaendiger Thread. Leider habe ich mit Threads bisher noch nicht gearbeitet. Ich habe mir Beispiele aus dem Internet angesehen, und festgestellt, dass diese alle anders aufgebaut sind, als dies bei "Netradio" der Fall ist.
Nun zu meinem Problem.
In der Prozedur "DoMeta" wird nach Moeglichkeit der Titel eines Radiostreams ausgelesen und ausgegeben. Diese Prozedur ist Teil des von Netradio verwendeten Threads.
In meinem Hauptprogramm habe ich Routinen zum Starten und Stoppen von Aufnahmen. Nun moechte ich aus der Prozedur "DoMeta" eine Aufnahme stoppen, wenn sich der Titel eines Streams aendert. Danach soll aus der Routine zum Stoppen eine neue Aufnahme gestartet werden.
Das Stoppen funktioniert noch, aber das neue Starten nicht. Dies liegt m. E. daran, dass dass Stoppen ja aus dem "Nebenthread" angestossen wurde. Das neue Starten wuerde aber wieder aus dem Hauptthread geschehen, und das funktioniert so nicht.
Wie kann ich eine neue Aufnahme triggern?
Ich verwende die Routinen zum Aufnehmen (Starten/Stoppen) fuer eine weitere Funktion des Programmes. Hierfuer funktioniert alles so wie ich es moechte. Sowohl von "Hand" gestartet und gestoppt, als auch durch programmierte Steuerung.
Nur in Verbindung mit der "Netradio"-Funktion nicht.
Irgendwie habe ich das "Gefuehl", dass der Thread des Netradio-Beispiels nicht so aufgebaut ist, wie es die anderen Beispiele ueber Threads zeigen.
Das Programm ist mit Firemonkey programmiert, wodurch ich auch noch keine Moeglichkeit mittels "Sendmessage" und einer "WndProc" Prozedur gefunden habe.
Hier der Teil, in der ein Titel ausgelesen wird, und ich eine laufende Aufnahme stoppen moechte:
Delphi-Quellcode:
procedure DoMeta();
var
Meta: PAnsiChar;
p: Integer;
Info1: String;
Info2: String;
begin
Meta := '';
try
// Get meta information from stream
Meta := BASS_ChannelGetTags(AudioStream, BASS_TAG_META);
except
end;
if (Meta <> nil) then
begin
try
// Try to read the stream title
p := Pos('StreamTitle=', String(AnsiString(Meta)));
if (p = 0) then
Exit;
p := p + 13;
// 'Cut' out the title of a stream and replace some special characters
try
Info1 := String(Copy(Meta, p, Pos(';', String(Meta)) - p - 1));
Info1 := StringReplace(Info1, '|', ' - ', [rfReplaceAll]);
Info1 := StringReplace(Info1, '/', ' - ', [rfReplaceAll]);
Info1 := StringReplace(Info1, '\', ' - ', [rfReplaceAll]);
Info1 := StringReplace(Info1, ':', ' - ', [rfReplaceAll]);
Info1 := StringReplace(Info1, '!', '', [rfReplaceAll]);
Info1 := StringReplace(Info1, ';', ' - ', [rfReplaceAll]);
Info1 := StringReplace(Info1, '*', '', [rfReplaceAll]);
Info1 := StringReplace(Info1, '#', '', [rfReplaceAll]);
Info1 := StringReplace(Info1, '>', '', [rfReplaceAll]);
Info1 := StringReplace(Info1, '<', '', [rfReplaceAll]);
// Set 'new' titel
NewTitle := Info1;
// Display title on form
Mainform.Lbl_Filename.Text := NewTitle;
// Check length of title
CheckTextLength;
// Refresh form
Mainform.Invalidate;
// Check if title has changed
if StreamTitle <> NewTitle then
begin
// Check if app is recording and the auto cut feature is enabled
if (AutoCut) and (IsRecording) then
StopRecording; // Stop recording and save file
// Set new title
StreamTitle := NewTitle;
end;
except
end;
except
end;
end;
end;
In der Routine zum Stoppen einere Aufnahme werden verschiedene Parameter geprueft, und ggf. die aufgenommene Datei abgespeichert. Dann wird noch geprueft, ob weitere Aufnahmen zu erledigen sind, und dies ggf. aus der Routine heraus gestartet.
Ich wuerde mein fertiges Programm spaeter gerne hier in den Projekten vorstellen. Dazu moechte ich es aber erst noch fertigstellen.
Vielleicht koennt ihr mir mit dem o. g. Problem ja weiterhelfen.
Danke schon mal im voraus!
Gruss
Micha