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 import reactor, task
from twisted.internet.defer import DeferredList from twisted.internet.defer import DeferredList
from twisted.python import log from twisted.python import log
import os, string, time import os, string, time, struct
safe_chars = string.ascii_letters+string.digits+' :;.,+-=$@' safe_chars = string.ascii_letters+string.digits+' :;.,+-=$@'
WAV_HEADER = "524946460c06000057415645666d74201400000031000100401f00005906000041000000020040016661637404000000000000006461746100000000".decode('hex')
AUDIO_TIMEOUT = 5.0 AUDIO_TIMEOUT = 5.0
def sanitizeFilename(name): def sanitizeFilename(name):
@ -35,7 +36,7 @@ class FRNRecorder(FRNClient):
ts = time.localtime() ts = time.localtime()
opname = sanitizeFilename(self.clients[client_id-1]['on']) opname = sanitizeFilename(self.clients[client_id-1]['on'])
dirname = "/var/spool/grn/recordings/"+time.strftime("%Y%m/%d/%H", ts) 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: try:
os.makedirs(dirname) os.makedirs(dirname)
except OSError: pass except OSError: pass
@ -44,19 +45,28 @@ class FRNRecorder(FRNClient):
def textMessageReceived(self, client, message, target): def textMessageReceived(self, client, message, target):
pass 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): def archiveRecording(self, from_id):
log.msg("%s stopped talking: starting playback." % log.msg("%s stopped talking: starting playback." %
self.clients[from_id-1]['on']) self.clients[from_id-1]['on'])
self.recordingFile.close() self.closeFile()
self.recordingFile = None self.recordingFile = None
self.recordingOperator = None self.recordingOperator = None
def audioFrameReceived(self, from_id, frames): def audioFrameReceived(self, from_id, frames):
if self.recordingOperator != self.clients[from_id-1]['on']: if self.recordingOperator != self.clients[from_id-1]['on']:
if self.recordingOperator is not None: if self.recordingOperator is not None:
self.recordingFile.close() self.closeFile()
self.recordingOperator = self.clients[from_id-1]['on'] self.recordingOperator = self.clients[from_id-1]['on']
self.recordingFile = file(self.buildRecordingName(from_id), 'wb') self.recordingFile = file(self.buildRecordingName(from_id), 'wb')
self.recordingFile.write(WAV_HEADER)
self.recordingFile.write(frames) self.recordingFile.write(frames)
try: try:
self.parrot_timer.reset(AUDIO_TIMEOUT) self.parrot_timer.reset(AUDIO_TIMEOUT)