def run(self): seq = 0 output_queue = deque() while not self.mumble_service.isServerSynched(): time.sleep(10) while self.running: while self.is_paused or not self.current_song: time.sleep(10) buf = self.decoder.read_samples(1) if buf == None or len(buf) == 0: time.sleep(10) continue compressed = self.ce.encode(buf, self.compressed_size) output_queue.append(compressed) if len(output_queue) < self.frames_per_packet: continue output_buffer = "\x00" * 1024 pds = PacketDataStream(output_buffer) while len(output_queue): seq += self.frames_per_packet pds.putInt(seq) for i in range(self.frames_per_packet): if len(output_queue) == 0: break tmp = output_queue.popleft() head = len(tmp) if i < self.frames_per_packet - 1: head = head | 0x80 pds.append(head) pds.appendDataBlock(tmp) size = pds.size() pds.rewind() data = [] data.append(chr(0 | self.mumble_service.getCodec() << 5)) data.extend(pds.getDataBlock(size)) self.mumble_service.sendUdpMessage("".join(data)) time.sleep(0.01 * self.frames_per_packet)
def main(): # Add the log message handler to the logger handler = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=10*1024*1024, backupCount=5) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) MumbleConnection.log.addHandler(handler) MumbleConnection.log.setLevel(logging.DEBUG) MumbleService.log.addHandler(handler) MumbleService.log.setLevel(logging.DEBUG) PingThread.log.addHandler(handler) PingThread.log.setLevel(logging.DEBUG) log.addHandler(handler) log.setLevel(logging.DEBUG) AUDIO_QUALITY = 60000 compressedSize=min(AUDIO_QUALITY / (100 * 8), 127) sample_rate=48000 frame_size = sample_rate / 100 ce = CeltEncoder(sample_rate, frame_size, 1) ce.setPredictionRequest(0) ce.setVBRRate(AUDIO_QUALITY) # f = open(AUDIO_FILE, 'rb') # file_data = f.read() # f.close() # f=wave.open(AUDIO_FILE, "rb") # (nc,sw,fr,nf,comptype, compname) = f.getparams() # log.debug("Channels: " + str(nc)) # log.debug("Frame Rate: " + str(fr)) # log.debug("Frames: " + str(nf)) # log.debug("Compression Type: " + str(comptype)) # log.debug("Compression Name: " + str(compname)) observer=MumbleService.MumbleService(HOST,PORT, 'TestBot', None) observer.connect() outputQueue = deque() eos = False # dm = muxer.Demuxer(AUDIO_FILE.split('.')[-1].lower()) # frames = dm.parse(file_data) # frame = frames[0] # dec = audio.acodec.Decoder(dm.streams[0]) # r = dec.decode(frame[1]) # pcm_data = str(r.data) # dec = MumbleDecoder(sample_rate, 1) # dec.decode_and_resample(AUDIO_FILE) md = MumbleDecoder(sample_rate, 1) md.decode_and_resample(AUDIO_FILE) seq = 0 buffer_size = (sample_rate / 100) * 2 framesPerPacket = 6 offset=0 while True: if observer.isServerSynched(): while not eos: buf = md.read_samples(1) #buf = dec.get_data(frame_size) # buf = f.read(frame_size*2) #offset = offset + frame_size if buf == None or len(buf) == 0: eos = True # f.close() continue compressed = ce.encode(buf, compressedSize) outputQueue.append(compressed) if len(outputQueue) < framesPerPacket: continue outputBuffer = "\x00" * 1024 pds = PacketDataStream(outputBuffer) while len(outputQueue) > 0: seq += framesPerPacket pds.putInt(seq) for i in range(framesPerPacket): if len(outputQueue) == 0: break tmp = outputQueue.popleft() head = len(tmp) if i < framesPerPacket - 1: head = head | 0x80 pds.append(head) pds.appendDataBlock(tmp) size = pds.size() pds.rewind() data = [] data.append(chr(0 | observer.getCodec() << 5)) data.extend(pds.getDataBlock(size)) observer.sendUdpMessage("".join(data)) time.sleep(0.01 * framesPerPacket) time.sleep(10)
def main(argv): try: opts, args = getopt.getopt( argv, "hs:u:p:f:", ["server=", "username="******"password="******"port=", "file=", "threshold"] ) except getopt.GetoptError: print helpdiag sys.exit(2) AUDIO_FILE = "" SERVERIP = "0.0.0.0" PASSWORD = "" USERNAME = "" PORT = 64738 THRESHVAL = 1000 fSERVER = False fPORT = False fUSER = False fAUDIO_FILE = False DOTHRESH = False for opt, arg in opts: if opt == ("-h", "--help"): print helpdiag sys.exit() elif opt in ("-s", "--server"): SERVERIP = arg fSERVER = True elif opt in ("-u", "--username"): USERNAME = arg fUSER = True elif opt in ("-p", "--password"): PASSWORD = arg elif opt in ("-f", "--file"): AUDIO_FILE = arg fAUDIO_FILE = True elif opt in ("--port"): PORT = arg fPORT = True elif opt in ("--threshold"): DOTHRESH = True if fUSER == False: print "Must have a username, quitting. See -h (--help)." sys.exit(2) if fSERVER == False: print "Using default server IP: 0.0.0.0" if fPORT == False: print "Using default port: 64738" # Add the log message handler to the logger handler = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=10 * 1024 * 1024, backupCount=5) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) MumbleConnection.log.addHandler(handler) MumbleConnection.log.setLevel(logging.DEBUG) MumbleService.log.addHandler(handler) MumbleService.log.setLevel(logging.DEBUG) PingThread.log.addHandler(handler) PingThread.log.setLevel(logging.DEBUG) log.addHandler(handler) log.setLevel(logging.DEBUG) AUDIO_QUALITY = 60000 # VBR-Rate compressedSize = min(AUDIO_QUALITY / (800), 127) sample_rate = 48000 frame_size = sample_rate / 100 # CeltEncoder(sample_rate, frame_size, channels) ce = CeltEncoder(sample_rate, frame_size, 1) ce.setPredictionRequest(0) ce.setVBRRate(AUDIO_QUALITY) observer = MumbleService.MumbleService(SERVERIP, PORT, USERNAME, PASSWORD) observer.connect() outputQueue = deque() eos = False # dm = muxer.Demuxer(AUDIO_FILE.split('.')[-1].lower()) # frames = dm.parse(file_data) # frame = frames[0] # dec = audio.acodec.Decoder(dm.streams[0]) # r = dec.decode(frame[1]) # pcm_data = str(r.data) # dec = MumbleDecoder(sample_rate, 1) # dec.decode_and_resample(AUDIO_FILE) # md = MumbleDecoder(sample_rate, 1) # md.decode_and_resample(AUDIO_FILE) if fAUDIO_FILE == True: f = open(AUDIO_FILE, "r") seq = 0 buffer_size = (sample_rate / 100) * 2 framesPerPacket = 6 offset = 0 while True: if observer.isServerSynched(): while not eos: if fAUDIO_FILE == True: buf = f.read(frame_size * 2) else: buf = sys.stdin.read(frame_size * 2) # 480*2=960 # buf = md.read_samples(1) #good but not needed # buf = dec.get_data(frame_size) # buf = f.read(frame_size*2) # offset = offset + frame_size if buf == None or len(buf) == 0: eos = True f.close() continue if DOTHRESH: rms = audioop.rms(buf, 2) if rms < THRESHVAL: continue compressed = ce.encode(buf, compressedSize) outputQueue.append(compressed) if len(outputQueue) < framesPerPacket: continue outputBuffer = "\x00" * 1024 pds = PacketDataStream(outputBuffer) while len(outputQueue) > 0: seq += framesPerPacket pds.putInt(seq) for i in range(framesPerPacket): if len(outputQueue) == 0: break tmp = outputQueue.popleft() head = len(tmp) if i < framesPerPacket - 1: head = head | 0x80 pds.append(head) pds.appendDataBlock(tmp) size = pds.size() pds.rewind() data = [] data.append(chr(0 | observer.getCodec() << 5)) data.extend(pds.getDataBlock(size)) observer.sendUdpMessage("".join(data)) time.sleep(0.01 * framesPerPacket)