Add RIFF WAVE header to recordings

This commit is contained in:
Maurizio Porrato 2010-10-08 21:08:08 +02:00
parent ef34d6c7be
commit 82ebc68e02
1 changed files with 14 additions and 4 deletions

View File

@ -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)