" 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. ] ] ] ]