| " |
| Simple UDP replay from the state files |
| " |
| |
| PackageLoader fileInPackage: #Sockets. |
| |
| Object subclass: RTPReplay [ |
| | filename | |
| RTPReplay class >> on: aFile [ |
| ^ self new |
| file: aFile; yourself |
| ] |
| |
| file: aFile [ |
| filename := aFile |
| ] |
| |
| streamAudio: aHost port: aPort [ |
| | file last_time last_image udp_send socket dest | |
| |
| last_time := nil. |
| last_image := nil. |
| file := FileStream open: filename. |
| |
| "Send the payload" |
| dest := Sockets.SocketAddress byName: aHost. |
| socket := Sockets.DatagramSocket new. |
| 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: []. |
| |
| udp_send value: data. |
| last_time := time. |
| last_image := wait_image. |
| ] |
| ] |
| ] |
| ] |
| |
| Eval [ |
| | replay | |
| |
| replay := RTPReplay on: 'rtp_ssrc6976010.240.240.1_to_10.240.240.50.state'. |
| |
| Transcript nextPutAll: 'Going to stream now'; nl. |
| replay streamAudio: '127.0.0.1' port: 4000. |
| ] |