blob: 7b68c0f5ec2dad136feacaadae8aeb6d4d85f229 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
"
Simple UDP replay from the state files
"
PackageLoader fileInPackage: #Sockets.
Object subclass: SDPUtils [
"Look into using PetitParser."
SDPUtils class >> findPort: aSDP [
aSDP linesDo: [:line |
(line startsWith: 'm=audio ') ifTrue: [
| stream |
stream := line readStream
skip: 'm=audio ' size;
yourself.
^ Number readFrom: stream.
]
].
^ self error: 'Not found'.
]
SDPUtils class >> findHost: aSDP [
aSDP linesDo: [:line |
(line startsWith: 'c=IN IP4 ') ifTrue: [
| stream |
^ stream := line readStream
skip: 'c=IN IP4 ' size;
upToEnd.
]
].
^ self error: 'Not found'.
]
]
Object subclass: RTPReplay [
| filename socket |
RTPReplay class >> on: aFile [
^ self new
initialize;
file: aFile; yourself
]
RTPReplay class >> on: aFile fromPort: aPort [
^ self new
initialize: aPort;
file: aFile; yourself
]
initialize [
self initialize: 0.
]
initialize: aPort [
socket := Sockets.DatagramSocket local: '0.0.0.0' port: aPort.
]
file: aFile [
filename := aFile
]
localPort [
^ socket port
]
streamAudio: aHost port: aPort [
| file last_time last_image udp_send dest |
last_time := nil.
last_image := nil.
file := FileStream open: filename mode: #read.
"Send the payload"
dest := Sockets.SocketAddress byName: aHost.
udp_send := [:payload | | datagram |
datagram := Sockets.Datagram data: payload contents address: dest port: aPort.
socket nextPut: datagram
].
[file atEnd] whileFalse: [
| lineStream time data now_image |
lineStream := file nextLine readStream.
"Read the time, skip the blank, parse the data"
time := Number readFrom: lineStream.
lineStream skip: 1.
data := WriteStream on: (ByteArray new: 30).
[lineStream atEnd] whileFalse: [
| hex |
hex := lineStream next: 2.
data nextPut: (Number readFrom: hex readStream radix: 16).
].
last_time isNil
ifTrue: [
"First time, send it right now"
last_time := time.
last_image := Time millisecondClockValue.
udp_send value: data.
]
ifFalse: [
| wait_image new_image_time |
"How long to wait?"
wait_image := last_image + ((time - last_time) * 1000).
[ wait_image > Time millisecondClockValue ]
whileTrue: [Processor yield].
udp_send value: data.
last_time := time.
last_image := wait_image.
]
]
]
]
|