Ik ben bezig met een threaded mp3 streamer, hierin zit een klasse streamer, die heeft als vars een IO object (voor de mp3-data) en een array van sockets om de data naar toe te sturen.
Die streamer klasse wordt gecreerd als iemand met winamp/mp3-player naar de ruby server (TCPServer op poort 9999) connect, de socket wordt toegevoegd aan de klasse, en de relevante mp3-file wordt gekoppeld aan de klasse. Andere mensen kunnen hiervan meegenieten door ook te connecten naar die server en dan wordt hun socket in die klasse erbij gehangen.
De klasse draait in een thread omdat er meerdere mensen mogelijk naar verschillende dingen willen luisteren, zodat meerder streamers vereist zijn:
hierin zit dus een mutex om te voorkomen dat tegelijk sockets worden toegevoegd aan de socket array, en dat de array wordt uitgelezen om naar toe te schrijven, ook zit er een check in om te kijken of de write goed ging, anders wordt de socket verwijderd. PACKETSIZE = 4096, zodat er elke keer 4k mp3 data wordt gelezen
Na deze uitleg dan het probleem:
Tijdens testen blijkt dit best redelijk te werken, maar het komt ook regelmatig voor dat winamp tijdelijk stopt met spelen om z'n buffer opnieuw te vullen.
In PHP heb ik een zelfde principe alleen daar heeft elke stream een eigen connectie met een PHP file (waardoor het dus niet mogelijk is om met meerdere mensen naar dezelfde stream te luisteren, wat uiteindelijk de reden was om in ruby eens iets te proberen)
Zou het er aan kunnen liggen dat m'n ISP poorten beperkt in doorvoer? of moet ik het toch echt aan de server kant zoeken? (de load is bijna niets dus dat kan de oorzaak niet zijn denk ik)
Of hebben mensen een idee hoe ik kan achterhalen wat de bottleneck is?
Die streamer klasse wordt gecreerd als iemand met winamp/mp3-player naar de ruby server (TCPServer op poort 9999) connect, de socket wordt toegevoegd aan de klasse, en de relevante mp3-file wordt gekoppeld aan de klasse. Andere mensen kunnen hiervan meegenieten door ook te connecten naar die server en dan wordt hun socket in die klasse erbij gehangen.
De klasse draait in een thread omdat er meerdere mensen mogelijk naar verschillende dingen willen luisteren, zodat meerder streamers vereist zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| Thread.start do
while (!@streamSource.eof)
data = @streamSource.read(PACKET_SIZE)
@mutex.synchronize {
@sockets.each { |x|
begin
x.write data
x.flush
rescue Errno::EPIPE
# remove socket from list
puts self.to_s + ' removes socket: ' + x.to_s
@sockets.delete(x)
end
}
end
@streamSource.close
@sockets.each { |x| x.close }
end |
hierin zit dus een mutex om te voorkomen dat tegelijk sockets worden toegevoegd aan de socket array, en dat de array wordt uitgelezen om naar toe te schrijven, ook zit er een check in om te kijken of de write goed ging, anders wordt de socket verwijderd. PACKETSIZE = 4096, zodat er elke keer 4k mp3 data wordt gelezen
Na deze uitleg dan het probleem:
Tijdens testen blijkt dit best redelijk te werken, maar het komt ook regelmatig voor dat winamp tijdelijk stopt met spelen om z'n buffer opnieuw te vullen.
In PHP heb ik een zelfde principe alleen daar heeft elke stream een eigen connectie met een PHP file (waardoor het dus niet mogelijk is om met meerdere mensen naar dezelfde stream te luisteren, wat uiteindelijk de reden was om in ruby eens iets te proberen)
Zou het er aan kunnen liggen dat m'n ISP poorten beperkt in doorvoer? of moet ik het toch echt aan de server kant zoeken? (de load is bijna niets dus dat kan de oorzaak niet zijn denk ik)
Of hebben mensen een idee hoe ik kan achterhalen wat de bottleneck is?
"When you find yourself in the company of a halfling and an ill-tempered Dragon, remember, you do not have to outrun the Dragon...you just have to outrun the halfling."