blob: dd32aed7a69610624a5d2d0aa703bb2c6ba16ce4 [file] [log] [blame]
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +02001"
2Simple UDP replay from the state files
3"
4
5PackageLoader fileInPackage: #Sockets.
6
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +02007Object subclass: SDPUtils [
8 "Look into using PetitParser."
9 SDPUtils class >> findPort: aSDP [
10 aSDP linesDo: [:line |
11 (line startsWith: 'm=audio ') ifTrue: [
12 | stream |
13 stream := line readStream
14 skip: 'm=audio ' size;
15 yourself.
16 ^ Number readFrom: stream.
17 ]
18 ].
19
20 ^ self error: 'Not found'.
21 ]
22
23 SDPUtils class >> findHost: aSDP [
24 aSDP linesDo: [:line |
25 (line startsWith: 'c=IN IP4 ') ifTrue: [
26 | stream |
27 ^ stream := line readStream
28 skip: 'c=IN IP4 ' size;
29 upToEnd.
30 ]
31 ].
32
33 ^ self error: 'Not found'.
34 ]
35]
36
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020037Object subclass: RTPReplay [
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +020038 | filename socket |
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020039 RTPReplay class >> on: aFile [
40 ^ self new
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +020041 initialize;
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020042 file: aFile; yourself
43 ]
44
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +020045 initialize [
46 socket := Sockets.DatagramSocket new.
47 ]
48
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020049 file: aFile [
50 filename := aFile
51 ]
52
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +020053 localPort [
54 ^ socket port
55 ]
56
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020057 streamAudio: aHost port: aPort [
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +020058 | file last_time last_image udp_send dest |
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020059
60 last_time := nil.
61 last_image := nil.
62 file := FileStream open: filename.
63
64 "Send the payload"
65 dest := Sockets.SocketAddress byName: aHost.
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020066 udp_send := [:payload | | datagram |
67 datagram := Sockets.Datagram data: payload contents address: dest port: aPort.
68 socket nextPut: datagram
69 ].
70
71 [file atEnd] whileFalse: [
72 | lineStream time data now_image |
73 lineStream := file nextLine readStream.
74
75 "Read the time, skip the blank, parse the data"
76 time := Number readFrom: lineStream.
77 lineStream skip: 1.
78
79 data := WriteStream on: (ByteArray new: 30).
80 [lineStream atEnd] whileFalse: [
81 | hex |
82 hex := lineStream next: 2.
83 data nextPut: (Number readFrom: hex readStream radix: 16).
84 ].
85
86 last_time isNil
87 ifTrue: [
88 "First time, send it right now"
89 last_time := time.
90 last_image := Time millisecondClockValue.
91 udp_send value: data.
92 ]
93 ifFalse: [
94 | wait_image new_image_time |
95
96 "How long to wait?"
97 wait_image := last_image + ((time - last_time) * 1000).
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +020098 [ wait_image > Time millisecondClockValue ]
99 whileTrue: [Processor yield].
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +0200100
101 udp_send value: data.
102 last_time := time.
103 last_image := wait_image.
104 ]
105 ]
106 ]
107]
108