Hi,

I recently found freevo while looking for a kind of media center app under linux
(allowing me to keep all my server stuff running on the same machine).

I really like it a lot, but I had a problem with sound too. mixer and ossmixer
plugins don't work with my alsa setup. I can see the mixer idlebar plugin
changing and the OSD volume messages with volume percentage increasing or
decreasing but the sound voume won't really change at all.
I tried changing MAJOR_AUDIO_CONTROL, CONTROL_ALL_AUDIO but nothing worked.

So, in case someone would be interested, I ducplicated ossmixer.py and modified
it into an alsamixer.py plugin that works with the python-alsaaudio module
(http://code.google.com/p/python-alsaaudio/).

I mainly tested it for the main volume for now but it *should* behave like the
ossmixer plugin.
I'm using a few config variable (that needs to be defined in local_conf.py) :
- ALSA_MIXER_NAME : the main volume mixer ('Master' for me)
- ALSA_MICMIXER_NAME : the mic volume mixer ('Mic' for me)
- ALSA_PCMMIXER_NAME : pcm volume mixer ('PCM' for me, but can be set to
'Master' too if there are no 'PCM' mixer controler, I tested it)
- ALSA_CARDID : the name of the card to be used ('hw:0' for me)
- ALSA_LINEMIXER_NAME : line in volume mixer

I also added a ALSA_LINE_CARDID ('hw:2' for me) on which ALSA_LINEMIXER_NAME
will be looked for (and not on my 'hw:0' main card).

I did it so that I can use it to control the output volume of my bt878 card
instead of controling a line-in (I don't have my TV card's output plugged into
my main soundcard, I'm using the snd_bt87x kernel module to have direct access
to the TV card sound outputs via either /dev/dsp2 for OSS and hw:2 for Alsa).

If you prefer to use the main card's line-in with ALSA_LINEMIXER_NAME, just set
it to whatever your line-in mixer control name is (taken from alsamixer for
example) and set ALSA_LINE_CARDID to the same value as ALSA_CARDID.

I hope all this was clear enough and that it can be useful to somebody.

Regards,
# -*- coding: iso-8859-1 -*-
# -----------------------------------------------------------------------
# alsamixer.py - The ALSA mixer interface for freevo.
# -----------------------------------------------------------------------
# $Id: alsamixer.py 9222 2007-02-17 10:13:50Z svax $
#
# Notes:
#
# I propose this could replace 'mixer.py' when it's been tested adequately.
#
# And to activate:
#
# plugin.remove('mixer')
# plugin.activate('alsamixer')
#
#
# Todo:        
#
# -----------------------------------------------------------------------
# Freevo - A Home Theater PC framework
# Copyright (C) 2002 Krister Lagerstrom, et al. 
# Please see the file freevo/Docs/CREDITS for a complete list of authors.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# -----------------------------------------------------------------------


"""For manipulating the mixer.
"""

import struct
import os

import config
import plugin
import rc
from event import *

import alsaaudio


class PluginInterface(plugin.DaemonPlugin):
    
    def __init__(self):
        self.main_mixer = None
        self.pcm_mixer = None
        self.line_mixer = None
        self.mic_mixer = None
        self.muted = 0
        
        # If you're using ALSA or something and you don't set the mixer,
        # why are we trying to open it?
        try:
            self.main_mixer = alsaaudio.Mixer( config.ALSA_MIXER_NAME, 0, 
config.ALSA_CARDID)
        except alsaaudio.ALSAAudioError:
            print 'Couldn\'t open mixer "%s"' % config.ALSA_MIXER_NAME
            return
        try:
            self.pcm_mixer = alsaaudio.Mixer( config.ALSA_PCMMIXER_NAME, 0, 
config.ALSA_CARDID)
        except alsaaudio.ALSAAudioError:
            print 'Couldn\'t open mixer "%s"' % config.ALSA_PCMMIXER_NAME
            return
        try:
            self.line_mixer = alsaaudio.Mixer( config.ALSA_LINEMIXER_NAME, 0, 
config.ALSA_LINE_CARDID)
        except alsaaudio.ALSAAudioError:
            print 'Couldn\'t open mixer "%s"' % config.ALSA_LINEMIXER_NAME
            return
        try:
            self.mic_mixer = alsaaudio.Mixer( config.ALSA_MICMIXER_NAME, 0, 
config.ALSA_CARDID)
        except alsaaudio.ALSAAudioError:
            print 'Couldn\'t open mixer "%s"' % config.ALSA_MICMIXER_NAME
            return

        # init here
        plugin.DaemonPlugin.__init__(self)
        self.plugin_name = 'MIXER'

        self.mainVolume   = 0
        self.pcmVolume    = 0
        self.lineinVolume = 0
        self.micVolume    = 0
        self.igainVolume  = 0 
        self.ogainVolume  = 0

        if config.MAJOR_AUDIO_CTRL == 'VOL':
            self.setMainVolume(config.DEFAULT_VOLUME)
            if config.CONTROL_ALL_AUDIO:
                self.setPcmVolume(config.MAX_VOLUME)
                self.setOgainVolume(config.MAX_VOLUME)
        elif config.MAJOR_AUDIO_CTRL == 'PCM':
            self.setPcmVolume(config.DEFAULT_VOLUME)
            if config.CONTROL_ALL_AUDIO:
                self.setMainVolume(config.MAX_VOLUME)
                self.setOgainVolume(config.MAX_VOLUME)
        else:
            _debug_("No appropriate audio channel found for mixer")

        if config.CONTROL_ALL_AUDIO:
            self.setLineinVolume(0)
            self.setMicVolume(0)


    def eventhandler(self, event=None, menuw=None, arg=None):
        """
        eventhandler to handle the VOL events
        """
        # Handle volume control
        if event == MIXER_VOLUP:
            if config.MAJOR_AUDIO_CTRL == 'VOL':
                self.incMainVolume()
                rc.post_event(Event(OSD_MESSAGE, arg=_('Volume: %s%%') % 
self.getVolume()))
            elif config.MAJOR_AUDIO_CTRL == 'PCM':
                self.incPcmVolume()
                rc.post_event(Event(OSD_MESSAGE, arg=_('Volume: %s%%') % 
self.getVolume()))
            return True
        
        elif event == MIXER_VOLDOWN:
            if config.MAJOR_AUDIO_CTRL == 'VOL':
                self.decMainVolume()
                rc.post_event(Event(OSD_MESSAGE, arg=_('Volume: %s%%') % 
self.getVolume()))
            elif config.MAJOR_AUDIO_CTRL == 'PCM':
                self.decPcmVolume()
                rc.post_event(Event(OSD_MESSAGE, arg=_('Volume: %s%%') % 
self.getVolume()))
            return True

        elif event == MIXER_MUTE:
            if self.getMuted() == 1:
                rc.post_event(Event(OSD_MESSAGE, arg=_('Volume: %s%%') % 
self.getVolume()))
                self.setMuted(0)
            else:
                rc.post_event(Event(OSD_MESSAGE, arg=_('Mute')))
                self.setMuted(1)
            return True

        return False



    def _setVolume(self, device, volume):
        if device:
            if volume < 0:
                volume = 0
            if volume > 100:
                volume = 100
            if device==self.line_mixer:
                device.setvolume(volume, 0)
            else:
                device.setvolume(volume)

    def getMuted(self):
        return(self.muted)

    def setMuted(self, mute):
        self.muted = mute
        if config.MAJOR_AUDIO_CTRL == 'VOL':
            if mute == 1:
                self.main_mixer.setmute(1)
            else:
                self.main_mixer.setmute(0)
        elif config.MAJOR_AUDIO_CTRL == 'PCM':
            if mute == 1:
                self.pcm_mixer.setmute(1)
            else:
                self.pcm_mixer.setmute(0)

    def getVolume(self):
        if config.MAJOR_AUDIO_CTRL == 'VOL':
            return self.mainVolume
        elif config.MAJOR_AUDIO_CTRL == 'PCM':
            return self.pcmVolume
        
    def getMainVolume(self):
        return self.mainVolume

    def setMainVolume(self, volume):
        self.mainVolume = volume
        self._setVolume(self.main_mixer, self.mainVolume)

    def incMainVolume(self):
        self.mainVolume += 5
        if self.mainVolume > 100:
            self.mainVolume = 100
        self._setVolume(self.main_mixer, self.mainVolume)

    def decMainVolume(self):
        self.mainVolume -= 5
        if self.mainVolume < 0:
            self.mainVolume = 0
        self._setVolume(self.main_mixer, self.mainVolume)

    def getPcmVolume(self):
        return self.pcmVolume
    
    def setPcmVolume(self, volume):
        self.pcmVolume = volume
        self._setVolume(self.pcm_mixer, volume)

    def incPcmVolume(self):
        self.pcmVolume += 5
        if self.pcmVolume > 100:
            self.pcmVolume = 100
        self._setVolume( self.pcm_mixer, self.pcmVolume )

    def decPcmVolume(self):
        self.pcmVolume -= 5
        if self.pcmVolume < 0:
            self.pcmVolume = 0
        self._setVolume( self.pcm_mixer, self.pcmVolume )
    
    def setLineinVolume(self, volume):
        if config.CONTROL_ALL_AUDIO:
            self.lineinVolume = volume
            self._setVolume(self.line_mixer, volume)

    def getLineinVolume(self):
        return self.lineinVolume
       
    def setMicVolume(self, volume):
        if config.CONTROL_ALL_AUDIO:
            self.micVolume = volume
            self._setVolume(self.mic_mixer, volume)

    def setIgainVolume(self, volume):
        if config.CONTROL_ALL_AUDIO:
            if volume > 100:
                volume = 100 
            elif volume < 0:
                volume = 0
            #self._setVolume(ossaudiodev.SOUND_MIXER_IGAIN, volume)

    def getIgainVolume(self):
        return self.igainVolume

    def decIgainVolume(self):
        self.igainVolume -= 5
        if self.igainVolume < 0:
            self.igainVolume = 0
        #self._setVolume(ossaudiodev.SOUND_MIXER_IGAIN, volume)
        
    def incIgainVolume(self):
        self.igainVolume += 5
        if self.igainVolume > 100:
            self.igainVolume = 100
        #self._setVolume(ossaudiodev.SOUND_MIXER_IGAIN, volume)

    def setOgainVolume(self, volume):
        if volume > 100:
            volume = 100 
        elif volume < 0:
            volume = 0
        self.ogainVolume = volume
        #self._setVolume(ossaudiodev.SOUND_MIXER_IGAIN, volume)

    def reset(self):
        if config.CONTROL_ALL_AUDIO:
            self.setLineinVolume(0)
            self.setMicVolume(0)
            if config.MAJOR_AUDIO_CTRL == 'VOL':
                self.setPcmVolume(config.DEFAULT_VOLUME)
            elif config.MAJOR_AUDIO_CTRL == 'PCM':
                self.setMainVolume(config.DEFAULT_VOLUME)

        self.setIgainVolume(0) # SB Live input from TV Card.
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-users

Reply via email to