119 lines
3.1 KiB
Smalltalk
119 lines
3.1 KiB
Smalltalk
"
|
|
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.
|
|
]
|
|
]
|
|
]
|
|
]
|
|
|