Skip to content

Commit

Permalink
voctocore: Allow multiple active audio sources
Browse files Browse the repository at this point in the history
  • Loading branch information
Florob committed Jul 28, 2017
1 parent cfba7bf commit a687797
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 18 deletions.
22 changes: 15 additions & 7 deletions voctocore/lib/audiomix.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,19 @@

class AudioMix(object):

def __init__(self, source=0):
def __init__(self, volumes=[]):
self.log = logging.getLogger('AudioMix')

self.selectedSource = source

self.caps = Config.get('mix', 'audiocaps')
self.names = Config.getlist('mix', 'sources')
self.log.info('Configuring Mixer for %u Sources', len(self.names))

if volumes:
self.volumes = volumes
else:
self.volumes = [0.0] * len(self.names)
self.volumes[0] = 1.0

pipeline = """
audiomixer name=mix !
{caps} !
Expand Down Expand Up @@ -67,19 +71,23 @@ def updateMixerState(self):
self.log.info('Updating Mixer-State')

for idx, name in enumerate(self.names):
volume = int(idx == self.selectedSource)
volume = self.volumes[idx]

self.log.debug('Setting Mixerpad %u to volume=%0.2f', idx, volume)
mixerpad = (self.mixingPipeline.get_by_name('mix')
.get_static_pad('sink_%u' % idx))
mixerpad.set_property('volume', volume)

def setAudioSource(self, source):
self.selectedSource = source
self.volumes = [float(idx == source) for idx in range(len(self.names))]
self.updateMixerState()

def setAudioSourceVolume(self, source, volume):
self.volumes[source] = volume
self.updateMixerState()

def getAudioSource(self):
return self.selectedSource
def getAudioVolumes(self):
return self.volumes

def on_eos(self, bus, message):
self.log.debug('Received End-of-Stream-Signal on Mixing-Pipeline')
Expand Down
22 changes: 19 additions & 3 deletions voctocore/lib/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,11 +143,16 @@ def set_video_b(self, src_name_or_id):
return NotifyResponse('video_status', *status)

def _get_audio_status(self):
src_id = self.pipeline.amix.getAudioSource()
return encodeName(self.sources, src_id)
volumes = self.pipeline.amix.getAudioVolumes()
return '{' + ', '.join(
'"{}": {:.4f}'.format(
encodeName(self.sources, idx),
volumes[idx]
) for idx in range(len(volumes))
) + '}'

def get_audio(self):
"""gets the name of the current audio-source"""
"""gets the current volumes of the audio-sources"""
status = self._get_audio_status()
return OkResponse('audio_status', status)

Expand All @@ -159,6 +164,17 @@ def set_audio(self, src_name_or_id):
status = self._get_audio_status()
return NotifyResponse('audio_status', status)

def set_audio_volume(self, src_name_or_id, volume):
"""sets the volume of the supplied source-name or source-id"""
src_id = decodeName(self.sources, src_name_or_id)
volume = float(volume)
if volume < 0.0:
raise ValueError("volume must be positive")
self.pipeline.amix.setAudioSourceVolume(src_id, volume)

status = self._get_audio_status()
return NotifyResponse('audio_status', status)

def _get_composite_status(self):
mode = self.pipeline.vmix.getCompositeMode()
return mode.name
Expand Down
19 changes: 11 additions & 8 deletions voctocore/lib/pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,17 +65,20 @@ def __init__(self):

# check if there is an audio source preconfigured
try:
audiosource_str = Config.get('mix', 'audiosource')
audiosource = names.index(audiosource_str)
except ValueError:
self.log.warn('Audiosource "%s" does not exist, '
'defaulting to "%s"', audiosource_str, names[0])
audiosource = 0
audiosource = Config.get('mix', 'audiosource')
volumes = [0.0] * len(names)
for source in audiosource.split(','):
src, *volume = source.split(':', 1)
volume = float(volume[0]) if volume else 1.0
try:
volumes[names.index(src)] = volume
except ValueError:
self.log.warn('Audiosource "%s" does not exist', src)
except NoOptionError:
audiosource = 0
volumes = []

self.log.info('Creating Audiomixer')
self.amix = AudioMix(audiosource)
self.amix = AudioMix(volumes)

port = 16000
self.log.info('Creating Mixer-Background VSource at tcp-port %u', port)
Expand Down

0 comments on commit a687797

Please sign in to comment.