blob: 7b68c0f5ec2dad136feacaadae8aeb6d4d85f229 [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
Jacob Erlbeck8b666492013-12-13 13:18:19 +010045 RTPReplay class >> on: aFile fromPort: aPort [
46 ^ self new
47 initialize: aPort;
48 file: aFile; yourself
49 ]
50
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +020051 initialize [
Jacob Erlbeck8b666492013-12-13 13:18:19 +010052 self initialize: 0.
53 ]
54
55 initialize: aPort [
56 socket := Sockets.DatagramSocket local: '0.0.0.0' port: aPort.
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +020057 ]
58
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020059 file: aFile [
60 filename := aFile
61 ]
62
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +020063 localPort [
64 ^ socket port
65 ]
66
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020067 streamAudio: aHost port: aPort [
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +020068 | file last_time last_image udp_send dest |
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020069
70 last_time := nil.
71 last_image := nil.
Jacob Erlbeck8b666492013-12-13 13:18:19 +010072 file := FileStream open: filename mode: #read.
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020073
74 "Send the payload"
75 dest := Sockets.SocketAddress byName: aHost.
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +020076 udp_send := [:payload | | datagram |
77 datagram := Sockets.Datagram data: payload contents address: dest port: aPort.
78 socket nextPut: datagram
79 ].
80
81 [file atEnd] whileFalse: [
82 | lineStream time data now_image |
83 lineStream := file nextLine readStream.
84
85 "Read the time, skip the blank, parse the data"
86 time := Number readFrom: lineStream.
87 lineStream skip: 1.
88
89 data := WriteStream on: (ByteArray new: 30).
90 [lineStream atEnd] whileFalse: [
91 | hex |
92 hex := lineStream next: 2.
93 data nextPut: (Number readFrom: hex readStream radix: 16).
94 ].
95
96 last_time isNil
97 ifTrue: [
98 "First time, send it right now"
99 last_time := time.
100 last_image := Time millisecondClockValue.
101 udp_send value: data.
102 ]
103 ifFalse: [
104 | wait_image new_image_time |
105
106 "How long to wait?"
107 wait_image := last_image + ((time - last_time) * 1000).
Holger Hans Peter Freytherf42e9082012-08-05 16:10:32 +0200108 [ wait_image > Time millisecondClockValue ]
109 whileTrue: [Processor yield].
Holger Hans Peter Freyther602559f2012-08-05 09:27:20 +0200110
111 udp_send value: data.
112 last_time := time.
113 last_image := wait_image.
114 ]
115 ]
116 ]
117]
118