Hallo
Ich versuche gerade bischen aus Spaß automatisch 2 Lieder ineinander zu mischen bzw. einen einfachen überganz zwischen zweien zu schaffen.
Das ganze soll danach noch zu nem Radioserver gestreamt werden.
Dies funktioniert auch schon sehr gut, problematisch ist nur, dass die Daten ja in Echtzeit in Relation zur Abspielgeschwindigkeit verarbeitet werden sollte, um den Prozessor möglichst gleichmäßig zu belasten und natürlich um die Daten in richiger Geschwindigkeit an den Radioserver zu senden.
Am einfachsten wäre ja:
geeigneten Buffer wählen, diesen x mal die Sekunde vom Decoder füllen lassen, bearbeiten, Encoden und zum Radioserver senden.
Problematisch ist dabei die Größe des Buffers: Es sind nur 1k Schritte nötig. Es ist also nicht ohne weiteres Möglich, mit konstanter Pause zwischen 2 Lesevorgängen zu arbeiten.
Meine Lösung:
Ich hab einen Thread am laufen, der andauernd die Datendurchflussmänge misst und anhand von der bestimmt, ob die Pause größer oder Kleiner werden muss. Sobald also zu viele Bytes angefallen sind die hätten gesendet werden sollen, wird die Pause verkleinert und die Durchfussmenge steigt.
Problem bei der Idee ist, dass die Pausendauer schneller geändert wird als dass der Arbeitsthread darauf reagieren könnte. Ziel ist natürlich, eine möglichst kleine (und kleiner werdende) kurve um die Optimaldurchflussmenge zu machen. Doch meine umsetzung vergrößert die Kurve immer mehr, da wie gesagt der Arbeitsthread nicht schnell genug Reagieren kann und somit die Pause (z.B.) immer länger wird, bis sie viel zu lang ist und sie schlagartig wieder unheimlich klein gemacht wird.
Eine einfache vergrößerung der Pausen zwischen 2x Durchflussmenge messen geht nicht, da dann Schwankungen (z.b. wenn etwas stark auf der cpu liegt) nichtmehr schnell genug abgefangen werden können. (es wird natürlich die dauer der Zeit, die für Berechnungen gebraucht wird, von der SleepTime abgezogen!)
Hat jemand ne Gute Idee zu dem Thema?
Meine Umsetzung:
private void CThread() {
const int BYTES_PER_LOOP = BYTES_PER_SECOND / 10;
int Bytes = 0;
while (true) {
Thread.Sleep(100);
Bytes += m_ReadBytes - BYTES_PER_LOOP;
m_ReadBytes = 0;
if (Bytes > 2048) {
m_SleepTime++;
} else if (Bytes < -2048) {
m_SleepTime--;
}
}
}