Add RIFF WAVE header to recordings
This commit is contained in:
parent
ef34d6c7be
commit
82ebc68e02
18
recorder.py
18
recorder.py
|
@ -10,9 +10,10 @@ from frn.user import FRNUser
|
|||
from twisted.internet import reactor, task
|
||||
from twisted.internet.defer import DeferredList
|
||||
from twisted.python import log
|
||||
import os, string, time
|
||||
import os, string, time, struct
|
||||
safe_chars = string.ascii_letters+string.digits+' :;.,+-=$@'
|
||||
|
||||
WAV_HEADER = "524946460c06000057415645666d74201400000031000100401f00005906000041000000020040016661637404000000000000006461746100000000".decode('hex')
|
||||
AUDIO_TIMEOUT = 5.0
|
||||
|
||||
def sanitizeFilename(name):
|
||||
|
@ -35,7 +36,7 @@ class FRNRecorder(FRNClient):
|
|||
ts = time.localtime()
|
||||
opname = sanitizeFilename(self.clients[client_id-1]['on'])
|
||||
dirname = "/var/spool/grn/recordings/"+time.strftime("%Y%m/%d/%H", ts)
|
||||
filename = time.strftime("%Y%m%d%H%M%S-", ts) + opname + '.gsm'
|
||||
filename = time.strftime("%Y%m%d%H%M%S-", ts) + opname + '.wav'
|
||||
try:
|
||||
os.makedirs(dirname)
|
||||
except OSError: pass
|
||||
|
@ -44,19 +45,28 @@ class FRNRecorder(FRNClient):
|
|||
def textMessageReceived(self, client, message, target):
|
||||
pass
|
||||
|
||||
def closeFile(self):
|
||||
size = self.recordingFile.tell()-len(WAV_HEADER)
|
||||
self.recordingFile.seek(0x30) # fact chunk value
|
||||
self.recordingFile.write(struct.pack("<L", int(size/32.5)))
|
||||
self.recordingFile.seek(0x38) # data chunk size
|
||||
self.recordingFile.write(struct.pack("<L", size))
|
||||
self.recordingFile.close()
|
||||
|
||||
def archiveRecording(self, from_id):
|
||||
log.msg("%s stopped talking: starting playback." %
|
||||
self.clients[from_id-1]['on'])
|
||||
self.recordingFile.close()
|
||||
self.closeFile()
|
||||
self.recordingFile = None
|
||||
self.recordingOperator = None
|
||||
|
||||
def audioFrameReceived(self, from_id, frames):
|
||||
if self.recordingOperator != self.clients[from_id-1]['on']:
|
||||
if self.recordingOperator is not None:
|
||||
self.recordingFile.close()
|
||||
self.closeFile()
|
||||
self.recordingOperator = self.clients[from_id-1]['on']
|
||||
self.recordingFile = file(self.buildRecordingName(from_id), 'wb')
|
||||
self.recordingFile.write(WAV_HEADER)
|
||||
self.recordingFile.write(frames)
|
||||
try:
|
||||
self.parrot_timer.reset(AUDIO_TIMEOUT)
|
||||
|
|
Loading…
Reference in New Issue