62 lines
2.3 KiB
Python
62 lines
2.3 KiB
Python
|
from __future__ import absolute_import
|
||
|
import platform
|
||
|
import sys
|
||
|
from .channel import Channel
|
||
|
from .main import bass_call, bass_call_0
|
||
|
from .external.pybass import *
|
||
|
|
||
|
convert_to_unicode = str
|
||
|
|
||
|
class BaseStream(Channel):
|
||
|
|
||
|
def _callback(*args):
|
||
|
#Stub it out as otherwise it'll crash, hard. Used for stubbing download procs
|
||
|
return 0
|
||
|
|
||
|
def free(self):
|
||
|
return bass_call(BASS_StreamFree, self.handle)
|
||
|
|
||
|
def get_file_position(self, mode):
|
||
|
return bass_call_0(BASS_StreamGetFilePosition, self.handle, mode)
|
||
|
|
||
|
class Stream(BaseStream):
|
||
|
|
||
|
def __init__(self, freq=44100, chans=2, flags=0, proc=None, user=None, three_d=False, autofree=False, decode=False):
|
||
|
self.proc = STREAMPROC(proc)
|
||
|
self.setup_flag_mapping()
|
||
|
flags = flags | self.flags_for(three_d=three_d, autofree=autofree, decode=decode)
|
||
|
handle = bass_call(BASS_StreamCreate, freq, chans, flags, self.proc, user)
|
||
|
super(Stream, self).__init__(handle)
|
||
|
|
||
|
class FileStream(BaseStream):
|
||
|
|
||
|
def __init__(self, mem=False, file=None, offset=0, length=0, flags=0, three_d=False, mono=False, autofree=False, decode=False, unicode=True):
|
||
|
"""Creates a sample stream from an MP3, MP2, MP1, OGG, WAV, AIFF or plugin supported file."""
|
||
|
if platform.system() == 'Darwin' or platform.system() == "Linux":
|
||
|
unicode = False
|
||
|
file = file.encode(sys.getfilesystemencoding())
|
||
|
self.setup_flag_mapping()
|
||
|
flags = flags | self.flags_for(three_d=three_d, autofree=autofree, mono=mono, decode=decode, unicode=unicode)
|
||
|
if unicode and isinstance(file, str):
|
||
|
file = convert_to_unicode(file)
|
||
|
self.file = file
|
||
|
handle = bass_call(BASS_StreamCreateFile, mem, file, offset, length, flags)
|
||
|
super(FileStream, self).__init__(handle)
|
||
|
|
||
|
def setup_flag_mapping(self):
|
||
|
super(FileStream, self).setup_flag_mapping()
|
||
|
self.flag_mapping.update({
|
||
|
'unicode': BASS_UNICODE
|
||
|
})
|
||
|
|
||
|
class URLStream(BaseStream):
|
||
|
|
||
|
def __init__(self, url="", offset=0, flags=0, downloadproc=None, user=None, three_d=False, autofree=False, decode=False):
|
||
|
self._downloadproc = downloadproc or self._callback #we *must hold on to this
|
||
|
self.downloadproc = DOWNLOADPROC(self._downloadproc)
|
||
|
self.url = url
|
||
|
self.setup_flag_mapping()
|
||
|
flags = flags | self.flags_for(three_d=three_d, autofree=autofree, decode=decode)
|
||
|
handle = bass_call(BASS_StreamCreateURL, url, offset, flags, self.downloadproc, user)
|
||
|
super(URLStream, self).__init__(handle)
|