82 lines
3.3 KiB
Python
82 lines
3.3 KiB
Python
from __future__ import absolute_import
|
|
from .external import pybass, pybassenc
|
|
from .main import bass_call, bass_call_0, FlagObject
|
|
|
|
class Encoder(FlagObject):
|
|
|
|
def setup_flag_mapping(self):
|
|
#super(Encoder, self).setup_flag_mapping()
|
|
self.flag_mapping = {
|
|
'pcm': pybassenc.BASS_ENCODE_PCM,
|
|
'no_header': pybassenc.BASS_ENCODE_NOHEAD,
|
|
'rf64': pybassenc.BASS_ENCODE_RF64,
|
|
'big_endian': pybassenc.BASS_ENCODE_BIGEND,
|
|
'fp_8bit': pybassenc.BASS_ENCODE_FP_8BIT,
|
|
'fp_16bit': pybassenc.BASS_ENCODE_FP_16BIT,
|
|
'fp_24bit': pybassenc.BASS_ENCODE_FP_24BIT,
|
|
'fp_32bit': pybassenc.BASS_ENCODE_FP_32BIT,
|
|
'queue': pybassenc.BASS_ENCODE_QUEUE,
|
|
'limit': pybassenc.BASS_ENCODE_LIMIT,
|
|
'no_limit': pybassenc.BASS_ENCODE_CAST_NOLIMIT,
|
|
'pause': pybassenc.BASS_ENCODE_PAUSE,
|
|
'autofree': pybassenc.BASS_ENCODE_AUTOFREE,
|
|
'unicode': pybass.BASS_UNICODE,
|
|
}
|
|
|
|
def __init__(self, source, command_line, pcm=False, no_header=False, rf64=False, big_endian=False, fp_8bit=False, fp_16bit=False, fp_24bit=False, fp_32bit=False, queue=False, limit=False, no_limit=False, pause=True, autofree=False, callback=None, user=None):
|
|
self.setup_flag_mapping()
|
|
flags = self.flags_for(pcm=pcm, no_header=no_header, rf64=rf64, big_endian=big_endian, fp_8bit=fp_8bit, fp_16bit=fp_16bit, fp_24bit=fp_24bit, fp_32bit=fp_32bit, queue=queue, limit=limit, no_limit=no_limit, pause=pause, autofree=autofree) #fwiw!
|
|
self.source = source
|
|
source_handle = source.handle
|
|
if callback is None:
|
|
callback = lambda *a: None
|
|
callback = pybassenc.ENCODEPROC(callback)
|
|
self.callback = callback
|
|
self.handle = bass_call(pybassenc.BASS_Encode_Start, source_handle, command_line, flags, callback, user)
|
|
|
|
@property
|
|
def paused(self):
|
|
return bass_call_0(pybassenc.BASS_Encode_IsActive, self.handle) == pybass.BASS_ACTIVE_PAUSED
|
|
|
|
@paused.setter
|
|
def paused(self, paused):
|
|
return bass_call(pybassenc.BASS_Encode_SetPaused, self.handle, paused)
|
|
|
|
def is_stopped(self):
|
|
return bass_call_0(pybassenc.BASS_Encode_IsActive, self.handle) == pybass.BASS_ACTIVE_STOPPED
|
|
|
|
|
|
def stop(self):
|
|
return bass_call(pybassenc.BASS_Encode_Stop, self.handle)
|
|
|
|
class BroadcastEncoder(Encoder):
|
|
|
|
def __init__(self, source_encoder, server, password, content, name=None, url=None, genre=None, description=None, headers=None, bitrate=0, public=False):
|
|
contents = {
|
|
'mp3': pybassenc.BASS_ENCODE_TYPE_MP3,
|
|
'ogg': pybassenc.BASS_ENCODE_TYPE_OGG,
|
|
'aac': pybassenc.BASS_ENCODE_TYPE_AAC
|
|
}
|
|
if content in contents:
|
|
content = contents[content]
|
|
self.source_encoder = source_encoder
|
|
handle = source_encoder.handle
|
|
self.server = server
|
|
self.password = password
|
|
self.status = bass_call(pybassenc.BASS_Encode_CastInit, handle, server, password, content, name, url, genre, description, headers, bitrate, public)
|
|
|
|
def set_title(self, title=None, url=None):
|
|
return bass_call(pybassenc.BASS_Encode_CastSetTitle, self.source_encoder.handle, title, url)
|
|
|
|
def get_stats(self, type, password=None):
|
|
types = {
|
|
'shoutcast': pybassenc.BASS_ENCODE_STATS_SHOUT,
|
|
'icecast': pybassenc.BASS_ENCODE_STATS_ICE,
|
|
'icecast_server': pybassenc.BASS_ENCODE_STATS_ICESERV,
|
|
}
|
|
if type in types:
|
|
type = types[type]
|
|
if password is None:
|
|
password = self.password
|
|
return bass_call(pybassenc.BASS_Encode_CastGetStats, self.handle, type, password)
|