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 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)
|
||||||
|
|
Loading…
Reference in New Issue