Add AlsaMixer.app to repository
http://dockapps.windowmaker.org/file.php/id/253 shows a version available from http://www.stud.fit.vutbr.cz/~xhlavk00/AlsaMixer.app/ but it's a dead link. Check in the version from http://dockapps.windowmaker.org/download.php/id/517/AlsaMixer.app-0.1.tar.gz Untarred and removed version from directory. No other changes. Signed-off-by: Wade Berrier <wberrier@gmail.com>
This commit is contained in:
parent
1424211102
commit
f331064eae
41
AlsaMixer.app/AMixer/AChannel.cc
Normal file
41
AlsaMixer.app/AMixer/AChannel.cc
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
// AChannel.cc, Petr Hlavka, 2004
|
||||||
|
|
||||||
|
#include "AMixer.h"
|
||||||
|
#include "AItem.h"
|
||||||
|
#include "AChannel.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
AChannel::AChannel(AItem *item, SNDCHID_T cID) {
|
||||||
|
aItem = item;
|
||||||
|
id = cID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AChannel::~AChannel() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
long AChannel::getVolume() {
|
||||||
|
long vol = 0;
|
||||||
|
|
||||||
|
snd_mixer_selem_get_playback_volume(aItem->aElem, (SNDCHID_T) id, &vol);
|
||||||
|
|
||||||
|
return (vol);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// it isn't necessery when using snd_mixer_selem_set_x_volume_all
|
||||||
|
void AChannel::setVolume(long value) {
|
||||||
|
std::cerr << "AChannel::setVolume not implemented!" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool AChannel::isMuted() {
|
||||||
|
int val;
|
||||||
|
|
||||||
|
snd_mixer_selem_get_playback_switch(aItem->aElem, (SNDCHID_T) id, &val);
|
||||||
|
|
||||||
|
return (! (bool) val);
|
||||||
|
}
|
28
AlsaMixer.app/AMixer/AChannel.h
Normal file
28
AlsaMixer.app/AMixer/AChannel.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
// AChannel.h, Petr Hlavka, 2004
|
||||||
|
|
||||||
|
#ifndef ACHANNEL_H
|
||||||
|
#define ACHANNEL_H
|
||||||
|
|
||||||
|
#include "AMixer.h"
|
||||||
|
#include "AItem.h"
|
||||||
|
|
||||||
|
#include <alsa/asoundlib.h>
|
||||||
|
|
||||||
|
#define SNDCHID_T snd_mixer_selem_channel_id_t
|
||||||
|
|
||||||
|
class AItem;
|
||||||
|
|
||||||
|
class AChannel {
|
||||||
|
private:
|
||||||
|
SNDCHID_T id; // channel id (front left, f. right, ...)
|
||||||
|
AItem *aItem; // parent mixer item
|
||||||
|
public:
|
||||||
|
AChannel(AItem *item, SNDCHID_T cID); // ctor
|
||||||
|
~AChannel(); // dtor
|
||||||
|
|
||||||
|
long getVolume(); // get channel volume
|
||||||
|
void setVolume(long value); // set channel volume
|
||||||
|
bool isMuted(); // return true, if channel is muted
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
87
AlsaMixer.app/AMixer/AItem.cc
Normal file
87
AlsaMixer.app/AMixer/AItem.cc
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
// AItem.cc, Petr Hlavka, 2004
|
||||||
|
|
||||||
|
#include "AItem.h"
|
||||||
|
#include "AMixer.h"
|
||||||
|
|
||||||
|
#include <alsa/asoundlib.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#define ROUND_POS(x) (long ((long (x) + 0.5 > (x)) ? (x) : (x) + 1))
|
||||||
|
|
||||||
|
|
||||||
|
// load only playback channels, don't care about common items
|
||||||
|
AItem::AItem(AMixer *m, snd_mixer_elem_t *e) {
|
||||||
|
mixer = m;
|
||||||
|
aElem = e;
|
||||||
|
|
||||||
|
name = snd_mixer_selem_get_name(aElem);
|
||||||
|
|
||||||
|
hPVolume = snd_mixer_selem_has_playback_volume(aElem);
|
||||||
|
hPSwitch = snd_mixer_selem_has_playback_switch(aElem);
|
||||||
|
|
||||||
|
if (hPVolume)
|
||||||
|
snd_mixer_selem_get_playback_volume_range(aElem, &minPVolume, &maxPVolume);
|
||||||
|
else
|
||||||
|
minPVolume = maxPVolume = 0;
|
||||||
|
|
||||||
|
for (int channel = 0; channel <= (int) SND_MIXER_SCHN_LAST; channel++) {
|
||||||
|
if (snd_mixer_selem_has_playback_channel(aElem, (SNDCHID_T) channel)) {
|
||||||
|
AChannel *ch = new AChannel(this, (SNDCHID_T) channel);
|
||||||
|
pbChannels.push_back(ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AItem::~AItem() {
|
||||||
|
for (unsigned int i = 0; i < pbChannels.size(); i++)
|
||||||
|
delete pbChannels[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// set same volume for all channels in this item in percent
|
||||||
|
void AItem::setVolumePerc(unsigned int percent) {
|
||||||
|
if (percent > 100)
|
||||||
|
percent = 100;
|
||||||
|
|
||||||
|
snd_mixer_selem_set_playback_volume_all(aElem, (long) ROUND_POS((minPVolume + (maxPVolume - minPVolume) * percent / 100.0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// get max channel volume of all channels in this item in percent
|
||||||
|
unsigned int AItem::getVolumePerc() {
|
||||||
|
long max_vol = 0, act_vol;
|
||||||
|
|
||||||
|
// find the max volume
|
||||||
|
for (unsigned int i = 0; i < pbChannels.size(); i++)
|
||||||
|
if ((act_vol = pbChannels[i]->getVolume()) > max_vol)
|
||||||
|
max_vol = act_vol;
|
||||||
|
|
||||||
|
// convert it into percent
|
||||||
|
if (minPVolume != maxPVolume)
|
||||||
|
return ((unsigned int) ROUND_POS((max_vol - minPVolume) * 100.0 / (maxPVolume - minPVolume)));
|
||||||
|
else
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// in this app side of view, item is muted if all channels is muted
|
||||||
|
bool AItem::isMuted() {
|
||||||
|
for (unsigned int i = 0; i < pbChannels.size(); i++)
|
||||||
|
if (!pbChannels[i]->isMuted())
|
||||||
|
return (false);
|
||||||
|
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// mute all channels
|
||||||
|
void AItem::mute() {
|
||||||
|
snd_mixer_selem_set_playback_switch_all(aElem, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// unmute all channels
|
||||||
|
void AItem::unmute() {
|
||||||
|
snd_mixer_selem_set_playback_switch_all(aElem, true);
|
||||||
|
}
|
39
AlsaMixer.app/AMixer/AItem.h
Normal file
39
AlsaMixer.app/AMixer/AItem.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
// AItem.h, Petr Hlavka, 2004
|
||||||
|
|
||||||
|
#ifndef AITEM_H
|
||||||
|
#define AITEM_H
|
||||||
|
|
||||||
|
#include "AMixer.h"
|
||||||
|
#include "AChannel.h"
|
||||||
|
|
||||||
|
#include <alsa/asoundlib.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
class AChannel;
|
||||||
|
class AMixer;
|
||||||
|
|
||||||
|
class AItem {
|
||||||
|
private:
|
||||||
|
AMixer *mixer; // parent mixer
|
||||||
|
std::vector<AChannel *> pbChannels; // item channels
|
||||||
|
|
||||||
|
long minPVolume, maxPVolume; // min/max playback volume
|
||||||
|
bool hPVolume; // has Playback volume
|
||||||
|
bool hPSwitch; // has Playback switch
|
||||||
|
|
||||||
|
public:
|
||||||
|
snd_mixer_elem_t *aElem; // mixer item element
|
||||||
|
const char *name; // item name
|
||||||
|
|
||||||
|
AItem(AMixer *m, snd_mixer_elem_t *e); // ctor
|
||||||
|
~AItem(); // dtor
|
||||||
|
|
||||||
|
void setVolumePerc(unsigned int percent);
|
||||||
|
unsigned int getVolumePerc();
|
||||||
|
bool isMuted();
|
||||||
|
void mute();
|
||||||
|
void unmute();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
203
AlsaMixer.app/AMixer/AMixer.cc
Normal file
203
AlsaMixer.app/AMixer/AMixer.cc
Normal file
|
@ -0,0 +1,203 @@
|
||||||
|
// AMixer.cc, Petr Hlavka, 2004
|
||||||
|
|
||||||
|
#include "AMixer.h"
|
||||||
|
#include "AItem.h"
|
||||||
|
|
||||||
|
#include <alsa/asoundlib.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
static bool mixerChangeIndicator = false;
|
||||||
|
static bool mixerReinitIndicator = false;
|
||||||
|
static int mixerCallback(snd_mixer_t *ctl, unsigned int mask,
|
||||||
|
snd_mixer_elem_t *elem);
|
||||||
|
static int itemCallback(snd_mixer_elem_t *elem, unsigned int mask);
|
||||||
|
|
||||||
|
|
||||||
|
AMixer::AMixer(const char *card) {
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (card) {
|
||||||
|
cardName = new char[std::strlen(card)];
|
||||||
|
std::strcpy(cardName, card);
|
||||||
|
for (int i = 0; i < MIXER_ITEMS; i++)
|
||||||
|
mixerItems[i] = NULL;
|
||||||
|
|
||||||
|
if ((err = snd_mixer_open(&mixerHandle, 0)) < 0) {
|
||||||
|
error("snd_mixer_open error", err);
|
||||||
|
mixerHandle = NULL;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((err = snd_mixer_attach(mixerHandle, card)) < 0) {
|
||||||
|
error("snd_mixer_attach error", err);
|
||||||
|
snd_mixer_close(mixerHandle);
|
||||||
|
mixerHandle = NULL;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((err = snd_mixer_selem_register(mixerHandle, NULL, NULL)) < 0) {
|
||||||
|
error("snd_mixer_selem_register error", err);
|
||||||
|
snd_mixer_close(mixerHandle);
|
||||||
|
mixerHandle = NULL;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((err = snd_mixer_load(mixerHandle)) < 0) {
|
||||||
|
error("snd_mixer_load error", err);
|
||||||
|
snd_mixer_close(mixerHandle);
|
||||||
|
mixerHandle = NULL;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
snd_mixer_set_callback(mixerHandle, (snd_mixer_callback_t) &mixerCallback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AMixer::~AMixer() {
|
||||||
|
if (mixerHandle) {
|
||||||
|
snd_mixer_free(mixerHandle);
|
||||||
|
snd_mixer_detach(mixerHandle, cardName);
|
||||||
|
delete[] cardName;
|
||||||
|
snd_mixer_close(mixerHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool AMixer::opened() {
|
||||||
|
return (mixerHandle != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AMixer::error(const char *errorString, int errorCode) {
|
||||||
|
std::cerr << cardName << ": " << errorString << ": " << snd_strerror(errorCode) << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AMixer::handleEvents() {
|
||||||
|
snd_mixer_handle_events(mixerHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AItem *AMixer::attachItem(unsigned int itemNumber, const char *itemName) {
|
||||||
|
if (itemNumber >= MIXER_ITEMS || !itemName)
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
// item was already created, so deregister callback and free it first
|
||||||
|
if (mixerItems[itemNumber]) {
|
||||||
|
snd_mixer_elem_set_callback(mixerItems[itemNumber]->aElem, NULL);
|
||||||
|
delete mixerItems[itemNumber];
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to find item by name, register callback, return success
|
||||||
|
snd_mixer_elem_t *elem;
|
||||||
|
for (elem = snd_mixer_first_elem(mixerHandle); elem; elem = snd_mixer_elem_next(elem)) {
|
||||||
|
if (snd_mixer_selem_is_active(elem) &&
|
||||||
|
snd_mixer_elem_get_type(elem) == SND_MIXER_ELEM_SIMPLE &&
|
||||||
|
std::strcmp(snd_mixer_selem_get_name(elem), itemName) == 0) {
|
||||||
|
snd_mixer_elem_set_callback(elem, (snd_mixer_elem_callback_t) &itemCallback);
|
||||||
|
return (mixerItems[itemNumber] = new AItem(this, elem));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool AMixer::itemOK(unsigned int itemNumber) {
|
||||||
|
return (itemNumber < MIXER_ITEMS && mixerItems[itemNumber]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int AMixer::itemGetVolume(unsigned int itemNumber) {
|
||||||
|
if (itemNumber >= MIXER_ITEMS || !mixerItems[itemNumber])
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
return ((int) mixerItems[itemNumber]->getVolumePerc());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AMixer::itemSetVolume(unsigned int itemNumber, unsigned int volume) {
|
||||||
|
if (itemNumber < MIXER_ITEMS && mixerItems[itemNumber])
|
||||||
|
mixerItems[itemNumber]->setVolumePerc(volume);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int AMixer::itemIsMuted(unsigned int itemNumber) {
|
||||||
|
if (itemNumber >= MIXER_ITEMS || !mixerItems[itemNumber])
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
return ((bool) mixerItems[itemNumber]->isMuted());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AMixer::itemToggleMute(unsigned int itemNumber) {
|
||||||
|
if (itemNumber < MIXER_ITEMS && mixerItems[itemNumber]) {
|
||||||
|
if (itemIsMuted(itemNumber))
|
||||||
|
mixerItems[itemNumber]->unmute();
|
||||||
|
else
|
||||||
|
mixerItems[itemNumber]->mute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// return true if mixer elm sent callback and this callback wasn't picked up yet
|
||||||
|
bool AMixer::mixerElemsChanged() {
|
||||||
|
if (mixerChangeIndicator) {
|
||||||
|
mixerChangeIndicator = false;
|
||||||
|
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// return true if mixer sent callback and this callback wasn't picked up yet
|
||||||
|
bool AMixer::mixerChanged() {
|
||||||
|
if (mixerReinitIndicator) {
|
||||||
|
mixerReinitIndicator = false;
|
||||||
|
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// this function should be called after mixer callback, reInit all items
|
||||||
|
void AMixer::reInit() {
|
||||||
|
for (int i = 0; i < MIXER_ITEMS; i++)
|
||||||
|
this->attachItem(i, mixerItems[i]->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int mixerCallback(snd_mixer_t *ctl, unsigned int mask,
|
||||||
|
snd_mixer_elem_t *elem) {
|
||||||
|
mixerReinitIndicator = true;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int itemCallback(snd_mixer_elem_t *elem, unsigned int mask) {
|
||||||
|
mixerChangeIndicator = true;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char* AMixer::convertIDToCard(const char* cardId) {
|
||||||
|
static char card[32] = "";
|
||||||
|
int i = snd_card_get_index(cardId);
|
||||||
|
|
||||||
|
if (i >= 0 && i < 32)
|
||||||
|
std::snprintf(card, 32, "hw:%i", i);
|
||||||
|
else
|
||||||
|
return (NULL);
|
||||||
|
|
||||||
|
return (card);
|
||||||
|
}
|
42
AlsaMixer.app/AMixer/AMixer.h
Normal file
42
AlsaMixer.app/AMixer/AMixer.h
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
// AMixer.h, Petr Hlavka, 2004
|
||||||
|
|
||||||
|
#ifndef AMIXER_H
|
||||||
|
#define AMIXER_H
|
||||||
|
|
||||||
|
#include "AItem.h"
|
||||||
|
|
||||||
|
#include <alsa/asoundlib.h>
|
||||||
|
|
||||||
|
#define MIXER_ITEMS 3
|
||||||
|
|
||||||
|
|
||||||
|
class AItem;
|
||||||
|
|
||||||
|
class AMixer {
|
||||||
|
private:
|
||||||
|
snd_mixer_t *mixerHandle;
|
||||||
|
AItem *mixerItems[MIXER_ITEMS];
|
||||||
|
char *cardName;
|
||||||
|
|
||||||
|
void error(const char *errorString, int errorCode);
|
||||||
|
|
||||||
|
public:
|
||||||
|
AMixer(const char *card); // ctor
|
||||||
|
~AMixer(); // dtor
|
||||||
|
|
||||||
|
bool opened();
|
||||||
|
void handleEvents();
|
||||||
|
AItem *attachItem(unsigned int itemNumber, const char *itemName);
|
||||||
|
bool itemOK(unsigned int itemNumber);
|
||||||
|
int itemGetVolume(unsigned int itemNumber);
|
||||||
|
void itemSetVolume(unsigned int itemNumber, unsigned int volume);
|
||||||
|
int itemIsMuted(unsigned int itemNumber);
|
||||||
|
void itemToggleMute(unsigned int itemNumber);
|
||||||
|
void reInit();
|
||||||
|
|
||||||
|
static bool mixerElemsChanged();
|
||||||
|
static bool mixerChanged();
|
||||||
|
static char* convertIDToCard(const char* cardId);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
42
AlsaMixer.app/AlsaMixer.app.spec
Normal file
42
AlsaMixer.app/AlsaMixer.app.spec
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
%define prefix /usr/local
|
||||||
|
|
||||||
|
Summary: dockable mixer for ALSA driver and Window Maker
|
||||||
|
Name: AlsaMixer.app
|
||||||
|
Version: 0.1
|
||||||
|
Release: 1
|
||||||
|
Source0: %{name}-%{version}.tar.gz
|
||||||
|
License: GPL
|
||||||
|
Group: X11/Utilities
|
||||||
|
BuildRoot: %{_tmppath}/%{name}-root
|
||||||
|
Packager: Petr Hlavka <xhlavk00@stud.fit.vutbr.cz>
|
||||||
|
Requires: XFree86-devel, libXpm-devel
|
||||||
|
URL: http://www.stud.fit.vutbr.cz/~xhlavk00/AlsaMixer.app/
|
||||||
|
|
||||||
|
%description
|
||||||
|
AlsaMixer.app is simple dockable mixer application for WindowMaker. It can
|
||||||
|
control up to three volume sources, load/store mixer settings, run external
|
||||||
|
application on middle click (i.e. more sophisticated mixer)
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%setup -q
|
||||||
|
|
||||||
|
%build
|
||||||
|
make
|
||||||
|
|
||||||
|
%install
|
||||||
|
rm -rf $RPM_BUILD_ROOT
|
||||||
|
mkdir -p -m 0755 $RPM_BUILD_ROOT%{prefix}/bin
|
||||||
|
cp -f AlsaMixer.app $RPM_BUILD_ROOT%{prefix}/bin
|
||||||
|
|
||||||
|
|
||||||
|
%clean
|
||||||
|
if [ -d $RPM_BUILD_ROOT ]; then rm -rf $RPM_BUILD_ROOT; fi
|
||||||
|
if [ -d $RPM_BUILD_DIR/%{name}-%{version} ]; then rm -rf $RPM_BUILD_DIR/%{name}-%{version}; fi
|
||||||
|
|
||||||
|
%files
|
||||||
|
%defattr(-,root,root)
|
||||||
|
%attr(0755,root,root) %{prefix}/bin/AlsaMixer.app
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Tue Sep 30 2004 Petr Hlavka
|
||||||
|
- initial release
|
340
AlsaMixer.app/COPYING
Normal file
340
AlsaMixer.app/COPYING
Normal file
|
@ -0,0 +1,340 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Appendix: How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) 19yy <name of author>
|
||||||
|
|
||||||
|
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
|
||||||
|
MERCHANTABILITY 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
33
AlsaMixer.app/INSTALL
Normal file
33
AlsaMixer.app/INSTALL
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
Installation instructions for AlsaMixer.app
|
||||||
|
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
- X11, libxpm (devel version of both), C++ development environment
|
||||||
|
Most (Linux) systems have these things installed by default.
|
||||||
|
If you don't have it look for packages that fit your
|
||||||
|
distribution (especially somelib-devel packages).
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
1) make
|
||||||
|
2) su
|
||||||
|
3) make install (to put it in /usr/local/GNUstep/Apps/AlsaMixer.app)
|
||||||
|
or
|
||||||
|
make install-x11 (to put it in /usr/X11R6/bin)
|
||||||
|
5) exit
|
||||||
|
|
||||||
|
|
||||||
|
Running
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
To run this program:
|
||||||
|
/usr/local/GNUstep/Apps/AlsaMixer.app/AlsaMixer &
|
||||||
|
or
|
||||||
|
/usr/X11R6/bin/AlsaMixer.app &
|
||||||
|
|
||||||
|
|
||||||
|
For more information about available command line arguments:
|
||||||
|
/usr/local/GNUstep/Apps/Mixer.app/AlsaMixer --help
|
||||||
|
or
|
||||||
|
/usr/X11R6/bin/AlsaMixer.app --help
|
31
AlsaMixer.app/Main.cc
Normal file
31
AlsaMixer.app/Main.cc
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
//
|
||||||
|
// Mixer.app
|
||||||
|
//
|
||||||
|
// Copyright (c) 1998-2002 Per Liden
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// MERCHANTABILITY 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "Mixer.h"
|
||||||
|
|
||||||
|
Mixer* app;
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
app = new Mixer(argc, argv);
|
||||||
|
app->run();
|
||||||
|
return 0;
|
||||||
|
}
|
35
AlsaMixer.app/Makefile
Normal file
35
AlsaMixer.app/Makefile
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#
|
||||||
|
# Mixer.app Makefile
|
||||||
|
#
|
||||||
|
|
||||||
|
DESTDIR =
|
||||||
|
GNUSTEP_BINDIR = /usr/local/GNUstep/Apps/AlsaMixer.app
|
||||||
|
X11_BINDIR = /usr/X11R6/bin
|
||||||
|
|
||||||
|
CXX=c++
|
||||||
|
CXXFLAGS += -Wall -pedantic -fno-rtti -fno-exceptions -O2 -I/usr/X11R6/include
|
||||||
|
LDFLAGS += -L/usr/X11R6/lib -lXpm -lXext -lX11 -lasound
|
||||||
|
|
||||||
|
OBJECTS = Main.o Mixer.o Xpm.o AMixer/AMixer.o AMixer/AItem.o AMixer/AChannel.o
|
||||||
|
|
||||||
|
all: AlsaMixer.app
|
||||||
|
|
||||||
|
AlsaMixer.app: $(OBJECTS)
|
||||||
|
$(CXX) $(OBJECTS) -o $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
.PHONY: install clean distclean
|
||||||
|
|
||||||
|
install: install-gnustep
|
||||||
|
|
||||||
|
install-gnustep: all
|
||||||
|
install -d $(DESTDIR)$(GNUSTEP_BINDIR)
|
||||||
|
install -m 0755 AlsaMixer.app $(DESTDIR)$(GNUSTEP_BINDIR)/AlsaMixer
|
||||||
|
|
||||||
|
install-x11: all
|
||||||
|
install -d $(DESTDIR)$(X11_BINDIR)
|
||||||
|
install -m 0755 AlsaMixer.app $(DESTDIR)$(X11_BINDIR)/AlsaMixer.app
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *~ $(OBJECTS) AlsaMixer.app
|
||||||
|
|
||||||
|
# End of file
|
598
AlsaMixer.app/Mixer.cc
Normal file
598
AlsaMixer.app/Mixer.cc
Normal file
|
@ -0,0 +1,598 @@
|
||||||
|
//
|
||||||
|
// Mixer.app
|
||||||
|
//
|
||||||
|
// Copyright (c) 1998-2002 Per Liden
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// MERCHANTABILITY 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <csignal>
|
||||||
|
#include "Xpm.h"
|
||||||
|
#include "Mixer.h"
|
||||||
|
|
||||||
|
#include "AMixer/AMixer.h"
|
||||||
|
|
||||||
|
#include "pixmaps/main.xpm"
|
||||||
|
#include "pixmaps/button.xpm"
|
||||||
|
#include "pixmaps/mutebutton.xpm"
|
||||||
|
#include "pixmaps/redlight.xpm"
|
||||||
|
|
||||||
|
#define ROUND_POS(x) (int ((x) + 0.5) > int (x)) ? (int) ((x) + 1) : (int) (x)
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
static const int ButtonX[] = {6, 24, 42};
|
||||||
|
static const char* MixerSources[] = { "Master", "PCM", "CD" };
|
||||||
|
|
||||||
|
extern Mixer* app;
|
||||||
|
|
||||||
|
void catchBrokenPipe(int sig)
|
||||||
|
{
|
||||||
|
app->saveVolumeSettings();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int positionToPercent(int position) {
|
||||||
|
return ROUND_POS(100 - (((position - BUTTON_MAX) * 100.0) / (BUTTON_MIN - BUTTON_MAX)));
|
||||||
|
}
|
||||||
|
|
||||||
|
int percentToPosition(int percent) {
|
||||||
|
return ROUND_POS(BUTTON_MIN - (percent * (BUTTON_MIN - BUTTON_MAX)) / 100.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Mixer::Mixer(int argc, char** argv)
|
||||||
|
{
|
||||||
|
XClassHint classHint;
|
||||||
|
XSizeHints sizeHints;
|
||||||
|
XWMHints wmHints;
|
||||||
|
Atom deleteWindow;
|
||||||
|
Xpm* image;
|
||||||
|
char* displayName = NULL;
|
||||||
|
char* card = "default";
|
||||||
|
|
||||||
|
mError = 0;
|
||||||
|
mInstanceName = INSTANCENAME;
|
||||||
|
mVolumeSource[0] = -1;
|
||||||
|
mVolumeSource[1] = -1;
|
||||||
|
mVolumeSource[2] = -1;
|
||||||
|
mVolumeMute[0] = 0;
|
||||||
|
mVolumeMute[1] = 0;
|
||||||
|
mVolumeMute[2] = 0;
|
||||||
|
mWheelButton = 1;
|
||||||
|
mLabelText = 0;
|
||||||
|
mSettingsFile = 0;
|
||||||
|
mSaveSettings = false;
|
||||||
|
mLoadSettings = false;
|
||||||
|
mCommand = NULL;
|
||||||
|
|
||||||
|
// Parse command line
|
||||||
|
if (argc>1) {
|
||||||
|
for (int i=1; i<argc; i++) {
|
||||||
|
// Display
|
||||||
|
if (!strcmp(argv[i], "-d")) {
|
||||||
|
checkArgument(argv, argc, i);
|
||||||
|
displayName = argv[i+1];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sound source
|
||||||
|
else if (!strcmp(argv[i], "-1") || !strcmp(argv[i], "-2") || !strcmp(argv[i], "-3")) {
|
||||||
|
checkArgument(argv, argc, i);
|
||||||
|
MixerSources[argv[i][1] - '1'] = argv[i + 1];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wheel binding
|
||||||
|
else if (!strcmp(argv[i], "-w")) {
|
||||||
|
checkArgument(argv, argc, i);
|
||||||
|
mWheelButton = atoi(argv[i+1]);
|
||||||
|
|
||||||
|
if (mWheelButton < 1 || mWheelButton > 3) {
|
||||||
|
cerr << APPNAME << ": invalid wheel binding, must be 1, 2 or 3, not " << argv[i+1] << endl;
|
||||||
|
tryHelp(argv[0]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Label text
|
||||||
|
else if (!strcmp(argv[i], "-l")) {
|
||||||
|
checkArgument(argv, argc, i);
|
||||||
|
mLabelText = argv[i+1];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save settings on exit
|
||||||
|
else if (!strcmp(argv[i], "-S")) {
|
||||||
|
mSaveSettings = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load settings on startup
|
||||||
|
else if (!strcmp(argv[i], "-L")) {
|
||||||
|
mLoadSettings = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load/Save settings file
|
||||||
|
else if (!strcmp(argv[i], "-f")) {
|
||||||
|
checkArgument(argv, argc, i);
|
||||||
|
mSettingsFile = argv[i+1];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute command on middle click
|
||||||
|
else if (!strcmp(argv[i], "-e")) {
|
||||||
|
checkArgument(argv, argc, i);
|
||||||
|
mCommand = argv[i + 1];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Instance name
|
||||||
|
else if (!strcmp(argv[i], "-n")) {
|
||||||
|
checkArgument(argv, argc, i);
|
||||||
|
mInstanceName = argv[i+1];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Version
|
||||||
|
else if (!strcmp(argv[i], "-v")) {
|
||||||
|
cerr << APPNAME << " version " << VERSION << endl;
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Help
|
||||||
|
else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {
|
||||||
|
showHelp();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// card
|
||||||
|
else if (!strcmp(argv[i], "--card")) {
|
||||||
|
card = AMixer::convertIDToCard(argv[i + 1]);
|
||||||
|
if (!card) {
|
||||||
|
cerr << APPNAME << ": invalid card number '" << argv[i + 1] << "'" << endl;
|
||||||
|
tryHelp(argv[0]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// device
|
||||||
|
else if (!strcmp(argv[i], "--device")) {
|
||||||
|
card = argv[i + 1];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unknown option
|
||||||
|
else {
|
||||||
|
cerr << APPNAME << ": invalid option '" << argv[i] << "'" << endl;
|
||||||
|
tryHelp(argv[0]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// default settings file
|
||||||
|
if (!mSettingsFile) {
|
||||||
|
char* home = getenv("HOME");
|
||||||
|
if (home) {
|
||||||
|
mSettingsFile = new char[strlen(home) + strlen(SETTINGS) + 1];
|
||||||
|
strcpy(mSettingsFile, home);
|
||||||
|
strcat(mSettingsFile, SETTINGS);
|
||||||
|
} else {
|
||||||
|
cerr << APPNAME << ": $HOME not set, could not find saved settings" << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// init mixer
|
||||||
|
aMixer = new AMixer(card);
|
||||||
|
if (!aMixer->opened()) {
|
||||||
|
cerr << APPNAME << ": could not open mixer device for card '" << card << "'" << endl;
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// open mixer sources
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
aMixer->attachItem(i, MixerSources[i]);
|
||||||
|
if (!aMixer->itemOK(i))
|
||||||
|
cerr << APPNAME << ": could not select mixer source '" << MixerSources[i] << "'" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open display
|
||||||
|
if ((mDisplay = XOpenDisplay(displayName)) == NULL) {
|
||||||
|
cerr << APPNAME << ": could not open display " << displayName << endl;
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get root window
|
||||||
|
mRoot = RootWindow(mDisplay, DefaultScreen(mDisplay));
|
||||||
|
|
||||||
|
// Create windows
|
||||||
|
mAppWin = XCreateSimpleWindow(mDisplay, mRoot, 1, 1, 64, 64, 0, 0, 0);
|
||||||
|
mIconWin = XCreateSimpleWindow(mDisplay, mAppWin, 0, 0, 64, 64, 0, 0, 0);
|
||||||
|
|
||||||
|
// Set classhint
|
||||||
|
classHint.res_name = mInstanceName;
|
||||||
|
classHint.res_class = CLASSNAME;
|
||||||
|
XSetClassHint(mDisplay, mAppWin, &classHint);
|
||||||
|
|
||||||
|
// Create delete atom
|
||||||
|
deleteWindow = XInternAtom(mDisplay, "WM_DELETE_WINDOW", False);
|
||||||
|
XSetWMProtocols(mDisplay, mAppWin, &deleteWindow, 1);
|
||||||
|
XSetWMProtocols(mDisplay, mIconWin, &deleteWindow, 1);
|
||||||
|
|
||||||
|
// Set windowname
|
||||||
|
XStoreName(mDisplay, mAppWin, APPNAME);
|
||||||
|
XSetIconName(mDisplay, mAppWin, APPNAME);
|
||||||
|
|
||||||
|
// Set sizehints
|
||||||
|
sizeHints.flags= USPosition;
|
||||||
|
sizeHints.x = 0;
|
||||||
|
sizeHints.y = 0;
|
||||||
|
XSetWMNormalHints(mDisplay, mAppWin, &sizeHints);
|
||||||
|
|
||||||
|
// Set wmhints
|
||||||
|
wmHints.initial_state = WithdrawnState;
|
||||||
|
wmHints.icon_window = mIconWin;
|
||||||
|
wmHints.icon_x = 0;
|
||||||
|
wmHints.icon_y = 0;
|
||||||
|
wmHints.window_group = mAppWin;
|
||||||
|
wmHints.flags = StateHint | IconWindowHint | IconPositionHint | WindowGroupHint;
|
||||||
|
XSetWMHints(mDisplay, mAppWin, &wmHints);
|
||||||
|
|
||||||
|
// Set command
|
||||||
|
XSetCommand(mDisplay, mAppWin, argv, argc);
|
||||||
|
|
||||||
|
// Set background image
|
||||||
|
image = new Xpm(mDisplay, mRoot, main_xpm);
|
||||||
|
if (mLabelText) {
|
||||||
|
image->drawString(LABEL_X, LABEL_Y, mLabelText);
|
||||||
|
}
|
||||||
|
image->setWindowPixmapShaped(mIconWin);
|
||||||
|
delete image;
|
||||||
|
|
||||||
|
// Create buttons
|
||||||
|
mButton[0] = XCreateSimpleWindow(mDisplay, mIconWin, ButtonX[0], BUTTON_MIN, 5, 5, 0, 0, 0);
|
||||||
|
mButton[1] = XCreateSimpleWindow(mDisplay, mIconWin, ButtonX[1], BUTTON_MIN, 5, 5, 0, 0, 0);
|
||||||
|
mButton[2] = XCreateSimpleWindow(mDisplay, mIconWin, ButtonX[2], BUTTON_MIN, 5, 5, 0, 0, 0);
|
||||||
|
|
||||||
|
image = new Xpm(mDisplay, mRoot, button_xpm);
|
||||||
|
image->setWindowPixmap(mButton[0]);
|
||||||
|
image->setWindowPixmap(mButton[1]);
|
||||||
|
image->setWindowPixmap(mButton[2]);
|
||||||
|
delete image;
|
||||||
|
|
||||||
|
XSelectInput(mDisplay, mButton[0], ButtonPressMask | ButtonReleaseMask | PointerMotionMask);
|
||||||
|
XSelectInput(mDisplay, mButton[1], ButtonPressMask | ButtonReleaseMask | PointerMotionMask);
|
||||||
|
XSelectInput(mDisplay, mButton[2], ButtonPressMask | ButtonReleaseMask | PointerMotionMask);
|
||||||
|
XSelectInput(mDisplay, mIconWin, ButtonPressMask);
|
||||||
|
|
||||||
|
XMapWindow(mDisplay, mButton[0]);
|
||||||
|
XMapWindow(mDisplay, mButton[1]);
|
||||||
|
XMapWindow(mDisplay, mButton[2]);
|
||||||
|
|
||||||
|
XMapWindow(mDisplay, mIconWin);
|
||||||
|
XMapWindow(mDisplay, mAppWin);
|
||||||
|
XSync(mDisplay, False);
|
||||||
|
|
||||||
|
// Catch broker pipe signal
|
||||||
|
signal(SIGPIPE, catchBrokenPipe);
|
||||||
|
|
||||||
|
// Check if error
|
||||||
|
if (mError) {
|
||||||
|
showErrorLed();
|
||||||
|
} else {
|
||||||
|
getVolume();
|
||||||
|
if (mLoadSettings)
|
||||||
|
loadVolumeSettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::tryHelp(char* appname)
|
||||||
|
{
|
||||||
|
cerr << "Try `" << appname << " --help' for more information" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::showHelp()
|
||||||
|
{
|
||||||
|
cerr << APPNAME << " Copyright (c) 1998-2002 by Per Liden (per@fukt.bth.se), Petr Hlavka (xhlavk00@stud.fit.vutbr.cz)" << endl << endl
|
||||||
|
<< "options:" << endl
|
||||||
|
<< " -1 <source> set sound source for control 1 (default is Master)" << endl
|
||||||
|
<< " -2 <source> set sound source for control 2 (default is PCM)" << endl
|
||||||
|
<< " -3 <source> set sound source for control 3 (default is CD)" << endl
|
||||||
|
<< " -w 1|2|3 bind a control button to the mouse wheel (default is 1)" << endl
|
||||||
|
<< " -l <text> set label text" << endl
|
||||||
|
<< " -S save volume settings on exit" << endl
|
||||||
|
<< " -L load volume settings on start up" << endl
|
||||||
|
<< " -f <file> use setting <file> instead of ~/GNUstep/Defaults/AlsaMixer" << endl
|
||||||
|
<< " --card <id> select card" << endl
|
||||||
|
<< " --device <dev> select device, default 'default'" << endl
|
||||||
|
<< " -e <command> execute <command> on middle click" << endl
|
||||||
|
<< " -n <name> set client instance name" << endl
|
||||||
|
<< " -d <disp> set display" << endl
|
||||||
|
<< " -v print version and exit" << endl
|
||||||
|
<< " -h, --help display this help and exit" << endl << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::checkArgument(char** argv, int argc, int index)
|
||||||
|
{
|
||||||
|
if (argc-1 < index+1) {
|
||||||
|
cerr << APPNAME << ": option '" << argv[index] << "' requires an argument" << endl;
|
||||||
|
tryHelp(argv[0]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::showErrorLed()
|
||||||
|
{
|
||||||
|
Window led;
|
||||||
|
Xpm* image;
|
||||||
|
|
||||||
|
led = XCreateSimpleWindow(mDisplay, mIconWin, LED_X, LED_Y, 3, 2, 0, 0, 0);
|
||||||
|
|
||||||
|
// Set background image
|
||||||
|
image = new Xpm(mDisplay, mRoot, redlight_xpm);
|
||||||
|
image->setWindowPixmap(led);
|
||||||
|
delete image;
|
||||||
|
|
||||||
|
// Show window
|
||||||
|
XMapWindow(mDisplay, led);
|
||||||
|
mError = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::loadVolumeSettings()
|
||||||
|
{
|
||||||
|
if (mSettingsFile) {
|
||||||
|
ifstream file(mSettingsFile);
|
||||||
|
if (file) {
|
||||||
|
// This could fail if the user has edited the file by hand and destroyed the structure
|
||||||
|
char dummy[1024];
|
||||||
|
file >> dummy; // {
|
||||||
|
file >> dummy; // Volume1
|
||||||
|
file >> dummy; // =
|
||||||
|
file >> mVolume[0];
|
||||||
|
file >> dummy; // ;
|
||||||
|
|
||||||
|
file >> dummy; // Volume2
|
||||||
|
file >> dummy; // =
|
||||||
|
file >> mVolume[1];
|
||||||
|
file >> dummy; // ;
|
||||||
|
|
||||||
|
file >> dummy; // Volume3
|
||||||
|
file >> dummy; // =
|
||||||
|
file >> mVolume[2];
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
setVolume(i, mVolume[i]);
|
||||||
|
setButtonPosition(i, percentToPosition(mVolume[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::saveVolumeSettings()
|
||||||
|
{
|
||||||
|
if (mSaveSettings) {
|
||||||
|
ofstream file(mSettingsFile);
|
||||||
|
if (file) {
|
||||||
|
// Files in ~/GNUstep/Defaults/ should follow the property list format
|
||||||
|
file << "{" << endl
|
||||||
|
<< " Volume1 = " << mVolumePos[0] << ";" << endl
|
||||||
|
<< " Volume2 = " << mVolumePos[1] << ";" << endl
|
||||||
|
<< " Volume3 = " << mVolumePos[2] << ";" << endl
|
||||||
|
<< "}" << endl;
|
||||||
|
file.close();
|
||||||
|
} else {
|
||||||
|
cerr << APPNAME << ": failed to save volume settings in " << mSettingsFile << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::getVolume()
|
||||||
|
{
|
||||||
|
static int lastVolume[3] = {-1, -1, -1};
|
||||||
|
static int lastVolumeMute[3] = {-1, -1, -1};
|
||||||
|
|
||||||
|
if (mError) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read from device
|
||||||
|
for (int i=0; i<3; i++) {
|
||||||
|
mVolume[i] = aMixer->itemGetVolume(i);
|
||||||
|
mVolumeMute[i] = aMixer->itemIsMuted(i);
|
||||||
|
|
||||||
|
if (lastVolume[i] != mVolume[i]) {
|
||||||
|
int y;
|
||||||
|
|
||||||
|
// Set button position
|
||||||
|
if (mError) {
|
||||||
|
y = BUTTON_MIN;
|
||||||
|
} else {
|
||||||
|
y = percentToPosition(mVolume[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
setButtonPosition(i, y);
|
||||||
|
lastVolume[i] = mVolume[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// set buttom type muted/unmuted
|
||||||
|
if (lastVolumeMute[i] != mVolumeMute[i]) {
|
||||||
|
setButtonType(i);
|
||||||
|
lastVolumeMute[i] = mVolumeMute[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mError) {
|
||||||
|
cerr << APPNAME << ": unable to read from " << mMixerDevice << endl;
|
||||||
|
showErrorLed();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::setVolume(int button, int volume)
|
||||||
|
{
|
||||||
|
if (mError) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store volume
|
||||||
|
mVolume[button] = volume;
|
||||||
|
|
||||||
|
// Write to device
|
||||||
|
aMixer->itemSetVolume(button, mVolume[button]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::toggleMute(int button)
|
||||||
|
{
|
||||||
|
mVolumeMute[button] = !mVolumeMute[button];
|
||||||
|
aMixer->itemToggleMute(button);
|
||||||
|
setButtonType(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::setButtonType(int button)
|
||||||
|
{
|
||||||
|
Xpm* image;
|
||||||
|
|
||||||
|
if (mVolumeMute[button] == 1) { // muted
|
||||||
|
image = new Xpm(mDisplay, mRoot, mutebutton_xpm);
|
||||||
|
image->setWindowPixmap(mButton[button]);
|
||||||
|
delete image;
|
||||||
|
|
||||||
|
XClearWindow(mDisplay, mButton[button]);
|
||||||
|
} else {
|
||||||
|
image = new Xpm(mDisplay, mRoot, button_xpm);
|
||||||
|
image->setWindowPixmap(mButton[button]);
|
||||||
|
delete image;
|
||||||
|
|
||||||
|
XClearWindow(mDisplay, mButton[button]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::setButtonPosition(int button, int position) {
|
||||||
|
if (position > BUTTON_MIN) {
|
||||||
|
position = BUTTON_MIN;
|
||||||
|
} else if (position < BUTTON_MAX) {
|
||||||
|
position = BUTTON_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
XMoveWindow(mDisplay, mButton[button], ButtonX[button], position);
|
||||||
|
|
||||||
|
mVolumePos[button] = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::setButtonPositionRelative(int button, int relativePosition)
|
||||||
|
{
|
||||||
|
int y;
|
||||||
|
|
||||||
|
// Calc new button position
|
||||||
|
y = mVolumePos[button] + relativePosition;
|
||||||
|
|
||||||
|
if (y > BUTTON_MIN) {
|
||||||
|
y = BUTTON_MIN;
|
||||||
|
} else if (y < BUTTON_MAX) {
|
||||||
|
y = BUTTON_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set button position and volume
|
||||||
|
XMoveWindow(mDisplay, mButton[button], ButtonX[button], y);
|
||||||
|
|
||||||
|
mVolumePos[button] = y;
|
||||||
|
|
||||||
|
// set volume
|
||||||
|
setVolume(button, positionToPercent(y));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mixer::run()
|
||||||
|
{
|
||||||
|
XEvent event;
|
||||||
|
int buttonDown = 0;
|
||||||
|
int buttonDownPosition = 0;
|
||||||
|
|
||||||
|
// Start handling events
|
||||||
|
while(1) {
|
||||||
|
while(XPending(mDisplay) || buttonDown) {
|
||||||
|
XNextEvent(mDisplay, &event);
|
||||||
|
|
||||||
|
switch(event.type) {
|
||||||
|
case ButtonPress:
|
||||||
|
if (event.xbutton.button == Button4 || event.xbutton.button == Button5) {
|
||||||
|
// Wheel scroll
|
||||||
|
setButtonPositionRelative(mWheelButton - 1, event.xbutton.button == Button5? 3: -3);
|
||||||
|
} else if (event.xbutton.button == Button1 && event.xbutton.window != mIconWin) {
|
||||||
|
// Volume change
|
||||||
|
buttonDown = 1;
|
||||||
|
buttonDownPosition = event.xbutton.y;
|
||||||
|
} else if (event.xbutton.button == Button3 && buttonDown == 0 && event.xbutton.window != mIconWin) {
|
||||||
|
// Mute
|
||||||
|
for (int i=0; i<3; i++) {
|
||||||
|
if (mButton[i] == event.xbutton.window) {
|
||||||
|
toggleMute(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (event.xbutton.button == Button2) {
|
||||||
|
// Load defaults or execute command
|
||||||
|
if (mCommand) {
|
||||||
|
char command[512];
|
||||||
|
|
||||||
|
snprintf(command, 512, "%s &", mCommand);
|
||||||
|
system(command);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
loadVolumeSettings();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ButtonRelease:
|
||||||
|
if (event.xbutton.button == Button1) {
|
||||||
|
buttonDown = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MotionNotify:
|
||||||
|
if (buttonDown) {
|
||||||
|
// Find button
|
||||||
|
for (int i=0; i<3; i++) {
|
||||||
|
if (mButton[i] == event.xmotion.window) {
|
||||||
|
setButtonPositionRelative(i, event.xmotion.y - buttonDownPosition);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Idle for a moment
|
||||||
|
usleep(100000);
|
||||||
|
|
||||||
|
// Update volume status
|
||||||
|
aMixer->handleEvents();
|
||||||
|
if (AMixer::mixerChanged())
|
||||||
|
aMixer->reInit();
|
||||||
|
else if (AMixer::mixerElemsChanged())
|
||||||
|
getVolume();
|
||||||
|
XSync(mDisplay, False);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
88
AlsaMixer.app/Mixer.h
Normal file
88
AlsaMixer.app/Mixer.h
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
//
|
||||||
|
// Mixer.app
|
||||||
|
//
|
||||||
|
// Copyright (c) 1998-2002 Per Liden
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// MERCHANTABILITY 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef _MIXER_H_
|
||||||
|
#define _MIXER_H_
|
||||||
|
|
||||||
|
#include "AMixer/AMixer.h"
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
|
#define APPNAME "AlsaMixer.app"
|
||||||
|
#define VERSION "1.8.0"
|
||||||
|
#define INSTANCENAME "alsamixer_app"
|
||||||
|
#define CLASSNAME "AlsaMixer_app"
|
||||||
|
#define SETTINGS "/GNUstep/Defaults/AlsaMixer"
|
||||||
|
#define MAX_COMMAND_LENGTH 512
|
||||||
|
|
||||||
|
#define LABEL_X 4
|
||||||
|
#define LABEL_Y 54
|
||||||
|
#define LABEL_FONT "-*-helvetica-medium-r-*-*-8-*-*-*-*-*-*-*"
|
||||||
|
|
||||||
|
#define LED_X 57
|
||||||
|
#define LED_Y 59
|
||||||
|
#define BUTTON_MIN 45
|
||||||
|
#define BUTTON_MAX 6
|
||||||
|
|
||||||
|
class Mixer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Mixer(int argc, char** argv);
|
||||||
|
~Mixer() {};
|
||||||
|
void run();
|
||||||
|
void saveVolumeSettings();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void tryHelp(char* appname);
|
||||||
|
void showHelp();
|
||||||
|
void checkArgument(char** argv, int argc, int index);
|
||||||
|
void showErrorLed();
|
||||||
|
void findMixerDevice();
|
||||||
|
void getVolume();
|
||||||
|
void setVolume(int button, int volume);
|
||||||
|
void toggleMute(int button);
|
||||||
|
void setButtonType(int button);
|
||||||
|
void setButtonPosition(int button, int position);
|
||||||
|
void setButtonPositionRelative(int button, int relativePosition);
|
||||||
|
void loadVolumeSettings();
|
||||||
|
|
||||||
|
Display* mDisplay;
|
||||||
|
Window mRoot;
|
||||||
|
Window mAppWin;
|
||||||
|
Window mIconWin;
|
||||||
|
Window mButton[3];
|
||||||
|
char* mMixerDevice;
|
||||||
|
char* mInstanceName;
|
||||||
|
char* mLabelText;
|
||||||
|
char* mSettingsFile;
|
||||||
|
char* mCommand;
|
||||||
|
int mError;
|
||||||
|
int mVolumeSource[3];
|
||||||
|
int mVolume[3];
|
||||||
|
int mVolumePos[3];
|
||||||
|
int mVolumeMute[3];
|
||||||
|
int mWheelButton;
|
||||||
|
bool mSaveSettings;
|
||||||
|
bool mLoadSettings;
|
||||||
|
AMixer* aMixer;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
80
AlsaMixer.app/README
Normal file
80
AlsaMixer.app/README
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
Description
|
||||||
|
--------------------------------------------------------------
|
||||||
|
AlsaMixer.app is a mixer utility for Linux systems with ALSA sound driver.
|
||||||
|
It is designed to be docked in Window Maker (and other wms). This utility has
|
||||||
|
three volume controllers that can be configured to handle any sound source,
|
||||||
|
he default sources are 'Master', 'PCM' and 'CD' volume. Sound sources can be
|
||||||
|
easily muted and there is also wheel mouse support.
|
||||||
|
The whole GUI and command parsing was taken from Mixer.app (see old doc
|
||||||
|
for URL's), only connection to ALSA driver was added.
|
||||||
|
|
||||||
|
|
||||||
|
Hints
|
||||||
|
--------------------------------------------------------------
|
||||||
|
Error led:
|
||||||
|
If the led on Mixer.app is red an error message has
|
||||||
|
been printed to stderr and something is not working
|
||||||
|
correctly. If the led is green everything is working ok.
|
||||||
|
(Error led doesn't work in AlsaMixer.app, TODO)
|
||||||
|
|
||||||
|
Mute:
|
||||||
|
Right click on a volume controller to mute the sound
|
||||||
|
source. The button will then have a red led in one corner.
|
||||||
|
Right click again to restore the volume. If a muted sound
|
||||||
|
source is modified by another application Mixer.app will
|
||||||
|
automaticaly release its muted state.
|
||||||
|
|
||||||
|
Wheel mouse:
|
||||||
|
If you have a wheel mouse (where the wheel is configured as
|
||||||
|
Button4 and Button5) you can control the volume by just moving
|
||||||
|
the mouse over Mixer.app and roll the wheel up and down. Use
|
||||||
|
the command line option -w to specify which slider that should
|
||||||
|
react to the wheel movement.
|
||||||
|
|
||||||
|
Label:
|
||||||
|
If you run multiple instances of AlsaMixer.app you might want
|
||||||
|
to be able to tell them apart. This can easily be done
|
||||||
|
by setting a label to each one of them. By using the -l
|
||||||
|
option you can add a little text label at the bottom of
|
||||||
|
the mixer.
|
||||||
|
|
||||||
|
Save volume settings:
|
||||||
|
Use the option -S (and -f <file>) if you want the volume
|
||||||
|
settings to be saved when AlsaMixer.app exits, and then
|
||||||
|
-L to be loaded again when AlsaMixer.app is started the next time.
|
||||||
|
When not using -f the settings are saved in/loaded from
|
||||||
|
~/GNUstep/Defaults/AlsaMixer. Use the -f <file> option
|
||||||
|
if you want to use a different file.
|
||||||
|
(TODO: mute states aren't saved/loaded)
|
||||||
|
|
||||||
|
Configurable middle click:
|
||||||
|
By default, when you middle click anywhere inside application
|
||||||
|
window, app tries to load default mixer setting from default
|
||||||
|
or explicitly configured (-f) file. If file doesn't exist,
|
||||||
|
nothing happens.
|
||||||
|
You can also configure AlsaMixer.app to run command (i.e.
|
||||||
|
better mixer) on middle click by using -e <command> option.
|
||||||
|
|
||||||
|
Bugs
|
||||||
|
--------------------------------------------------------------
|
||||||
|
If you discover any bugs in this software, please send a
|
||||||
|
bugreport to xhlavk00@stud.fit.vutbr.cz and describe the problem.
|
||||||
|
|
||||||
|
|
||||||
|
Special thanks to
|
||||||
|
--------------------------------------------------------------
|
||||||
|
Per Liden <per@fukt.bth.se> - original author of Mixer.app
|
||||||
|
David Sauer <davids@iol.cz>
|
||||||
|
Theo Schlossnagle <theo@omniti.com>
|
||||||
|
Alban Hertroys <dalroi@wit401310.student.utwente.nl>
|
||||||
|
|
||||||
|
|
||||||
|
Copyright
|
||||||
|
--------------------------------------------------------------
|
||||||
|
AlsaMixer.app, 2004, Petr Hlavka
|
||||||
|
Mixer.app is copyright (c) 1998-2002 by Per Liden and is
|
||||||
|
licensed through the GNU General Public License. Read the
|
||||||
|
COPYING file for the complete license.
|
||||||
|
|
||||||
|
Minor parts of this code were taken from asmixer by Rob Malda
|
||||||
|
(malda@slashdot.org)
|
107
AlsaMixer.app/Xpm.cc
Normal file
107
AlsaMixer.app/Xpm.cc
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
//
|
||||||
|
// Mixer.app
|
||||||
|
//
|
||||||
|
// Copyright (c) 1998-2002 Per Liden
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// MERCHANTABILITY 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/xpm.h>
|
||||||
|
#include <X11/extensions/shape.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include "Mixer.h"
|
||||||
|
#include "Xpm.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
Xpm::Xpm(Display* display, Window root, char** data)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
mDisplay = display;
|
||||||
|
|
||||||
|
mAttributes.valuemask = 0;
|
||||||
|
error = XpmCreatePixmapFromData(mDisplay, root, data, &mImage, &mMask, &mAttributes);
|
||||||
|
|
||||||
|
switch (error) {
|
||||||
|
case XpmColorError:
|
||||||
|
cerr << APPNAME << ": xpm image loaded but did not get all colors needed" << endl;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XpmColorFailed:
|
||||||
|
cerr << APPNAME << ": could not load xpm image (not enough colors available)" << endl;
|
||||||
|
exit(0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XpmNoMemory:
|
||||||
|
cerr << APPNAME << ": could not load xpm image (not enough memory available)" << endl;
|
||||||
|
exit(0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XpmOpenFailed:
|
||||||
|
case XpmFileInvalid:
|
||||||
|
cerr << APPNAME << ": could not load xpm image (image broken or corrupt)" << endl;
|
||||||
|
exit(0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XpmSuccess:
|
||||||
|
default:
|
||||||
|
// Image loaded ok
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Xpm::~Xpm()
|
||||||
|
{
|
||||||
|
if (mImage) {
|
||||||
|
XFreePixmap(mDisplay, mImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mMask) {
|
||||||
|
XFreePixmap(mDisplay, mMask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Xpm::setWindowPixmap(Window win)
|
||||||
|
{
|
||||||
|
XResizeWindow(mDisplay, win, mAttributes.width, mAttributes.height);
|
||||||
|
XSetWindowBackgroundPixmap(mDisplay, win, mImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Xpm::setWindowPixmapShaped(Window win)
|
||||||
|
{
|
||||||
|
XResizeWindow(mDisplay, win, mAttributes.width, mAttributes.height);
|
||||||
|
XSetWindowBackgroundPixmap(mDisplay, win, mImage);
|
||||||
|
XShapeCombineMask(mDisplay, win, ShapeBounding, 0, 0, mMask, ShapeSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Xpm::drawString(int x, int y, char* text)
|
||||||
|
{
|
||||||
|
Font font;
|
||||||
|
GC gc;
|
||||||
|
XGCValues gcv;
|
||||||
|
|
||||||
|
font = XLoadFont(mDisplay, LABEL_FONT);
|
||||||
|
gcv.font = font;
|
||||||
|
gcv.foreground = WhitePixel(mDisplay, DefaultScreen(mDisplay));
|
||||||
|
gc = XCreateGC(mDisplay, mImage, GCFont | GCForeground, &gcv);
|
||||||
|
XDrawString(mDisplay, mImage, gc, x, y, text, strlen(text));
|
||||||
|
XFreeGC(mDisplay, gc);
|
||||||
|
XUnloadFont(mDisplay, font);
|
||||||
|
}
|
44
AlsaMixer.app/Xpm.h
Normal file
44
AlsaMixer.app/Xpm.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
//
|
||||||
|
// Mixer.app
|
||||||
|
//
|
||||||
|
// Copyright (c) 1998-2002 Per Liden
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// MERCHANTABILITY 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.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef _XPM_H_
|
||||||
|
#define _XPM_H_
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/xpm.h>
|
||||||
|
|
||||||
|
class Xpm
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Xpm(Display* display, Window root, char** data);
|
||||||
|
virtual ~Xpm();
|
||||||
|
void setWindowPixmap(Window win);
|
||||||
|
void setWindowPixmapShaped(Window win);
|
||||||
|
void drawString(int x, int y, char* text);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Display* mDisplay;
|
||||||
|
XpmAttributes mAttributes;
|
||||||
|
Pixmap mImage;
|
||||||
|
Pixmap mMask;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
95
AlsaMixer.app/olddoc/ChangeLog.Mixer.app
Normal file
95
AlsaMixer.app/olddoc/ChangeLog.Mixer.app
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
Version Description
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
1.8.0 - Released 2002-09-15
|
||||||
|
- Now supports all mixer sources. NOTE! The source names have
|
||||||
|
been changed. See "Mixer.app -h".
|
||||||
|
- Added alternative skin submitted by Hans D. <barross@web.de>.
|
||||||
|
- Fixed warnings when compiling with GCC 3.2.
|
||||||
|
- Added OpenBSD support (thanks to ptiJo <ptiJo@noos.fr>).
|
||||||
|
|
||||||
|
1.7.0 - Released 2001-06-25
|
||||||
|
- Fixed compilation problems.
|
||||||
|
|
||||||
|
1.6.0 - Released 2001-03-17
|
||||||
|
- Mixer.app is now devfs friendly, which means it will try to
|
||||||
|
use /dev/sound/mixer or /dev/sound/mixer1 first and fall back
|
||||||
|
to /dev/mixer if that didn't work.
|
||||||
|
- New Makefile.
|
||||||
|
|
||||||
|
1.5.0 - Released 2000-02-21.
|
||||||
|
- Added command line options -s and -S <file>, which cause
|
||||||
|
Mixer.app to load/save volume settings when starting/exiting.
|
||||||
|
When the option -s is used, settings are loaded from/saved in
|
||||||
|
~/GNUstep/Defaults/Mixer. Use -S <file> if you want Mixer.app
|
||||||
|
to use a different file.
|
||||||
|
- Fixed potential bug in command line parsing.
|
||||||
|
|
||||||
|
1.4.1 - Released 1999-05-28.
|
||||||
|
- Added command line option -l <text> that can be used to
|
||||||
|
add a text label in the corner of the mixer.
|
||||||
|
|
||||||
|
1.4.0 - Released 1999-05-09.
|
||||||
|
- Added support for wheel mice. One of the sliders (use -w to
|
||||||
|
specify which one) will react on wheel movement.
|
||||||
|
- Misc. code clean up.
|
||||||
|
|
||||||
|
1.3.3 - Released 1999-05-02.
|
||||||
|
- Fixed problem that caused Mixer.app to die.
|
||||||
|
|
||||||
|
1.3.2 - Released 1999-04-18.
|
||||||
|
- Fixed exit bug. Mixer.app will now exit properly when
|
||||||
|
the windowmanager terminates.
|
||||||
|
|
||||||
|
1.3.1 - Released 1999-02-09.
|
||||||
|
- Added new mute function (right click).
|
||||||
|
- Rewrote command-line parsing, not using getopt anymore.
|
||||||
|
- Minor code clean up.
|
||||||
|
|
||||||
|
1.3.0 - Released 1999-02-04.
|
||||||
|
- New design.
|
||||||
|
- I didn't find the mute function very usefull so I removed it.
|
||||||
|
- Doing 'make install' will now install it in
|
||||||
|
/usr/local/GNUstep/Apps/Mixer.app/.
|
||||||
|
|
||||||
|
1.2.0 - Released 1998-12-01.
|
||||||
|
- Moved back to old design. The design of version 1.1.1 made
|
||||||
|
Mixer.app (and Window Maker) unstable due to some strange
|
||||||
|
race condition at startup. It worked on some machines and
|
||||||
|
some not, so I desided to go back to the old design.
|
||||||
|
- Increased idle interval to reduce CPU usage.
|
||||||
|
|
||||||
|
1.1.1 - Released 1998-11-14.
|
||||||
|
- Fixed XGetImage errors, (slow machines may still have this
|
||||||
|
problem, please report any errors).
|
||||||
|
- Added command line option -m <dev> to set mixer device.
|
||||||
|
- Added command line option -n <name> to set instance name.
|
||||||
|
- Compiling under FreeBSD now works fine.
|
||||||
|
|
||||||
|
1.1.0 - Released 1998-11-14.
|
||||||
|
- Alarm singals are no longer used so now the "Alarm Clock"
|
||||||
|
problem is solved for sure!
|
||||||
|
- Mute function.
|
||||||
|
- New design.
|
||||||
|
|
||||||
|
1.0.5 - Released 1998-09-05.
|
||||||
|
- Fixed the "Alarm Clock" problem.
|
||||||
|
- Fixed problem when using WindowPlacement = manual
|
||||||
|
in WindowMaker.
|
||||||
|
|
||||||
|
1.0.4 - Released 1998-03-19.
|
||||||
|
- Just some minor internal changes.
|
||||||
|
|
||||||
|
1.0.3 - Released 1998-02-24.
|
||||||
|
- Changed default timerinterval.
|
||||||
|
- Minor changes to eventhandling code.
|
||||||
|
|
||||||
|
1.0.2 - Released 1998-02-23.
|
||||||
|
- If the red led goes on (an error has occured) the control
|
||||||
|
buttons are set to volume 0.
|
||||||
|
|
||||||
|
1.0.1 - Released 1998-02-23.
|
||||||
|
- Changed classname to "mixer_app.Mixer_app".
|
||||||
|
|
||||||
|
1.0.0 - Released 1998-02-22.
|
||||||
|
- First official version.
|
||||||
|
|
33
AlsaMixer.app/olddoc/INSTALL.Mixer.app
Normal file
33
AlsaMixer.app/olddoc/INSTALL.Mixer.app
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
Installation instructions for Mixer.app
|
||||||
|
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
- X11, libxpm, C++ development environment
|
||||||
|
Most (Linux) systems have these things installed by default.
|
||||||
|
If you don't have it look for packages that fit your
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
1) make
|
||||||
|
2) su
|
||||||
|
3) make install (to put it in /usr/local/GNUstep/Apps/Mixer.app)
|
||||||
|
or
|
||||||
|
make install-x11 (to put it in /usr/X11R6/bin)
|
||||||
|
5) exit
|
||||||
|
|
||||||
|
|
||||||
|
Running
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
To run this program:
|
||||||
|
/usr/local/GNUstep/Apps/Mixer.app/Mixer &
|
||||||
|
or
|
||||||
|
/usr/X11R6/bin/Mixer.app &
|
||||||
|
|
||||||
|
|
||||||
|
For more information about available command line arguments:
|
||||||
|
/usr/local/GNUstep/Apps/Mixer.app/Mixer --help
|
||||||
|
or
|
||||||
|
/usr/X11R6/bin/Mixer.app --help
|
75
AlsaMixer.app/olddoc/README.Mixer.app
Normal file
75
AlsaMixer.app/olddoc/README.Mixer.app
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
|
||||||
|
Mixer.app
|
||||||
|
<http://www.fukt.bth.se/~per/mixer/>
|
||||||
|
|
||||||
|
by Per Liden
|
||||||
|
<per@fukt.bth.se>
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
--------------------------------------------------------------
|
||||||
|
Mixer.app is a mixer utility for Linux/FreeBSD/OpenBSD systems.
|
||||||
|
It is designed to be docked in Window Maker. This utility has
|
||||||
|
three volume controllers that can be configured to handle any
|
||||||
|
sound source, the default sources are master-, cd- and pcm-volume.
|
||||||
|
Sound sources can easily be muted and there is also wheel mouse
|
||||||
|
support.
|
||||||
|
|
||||||
|
|
||||||
|
Hints
|
||||||
|
--------------------------------------------------------------
|
||||||
|
Error led:
|
||||||
|
If the led on Mixer.app is red an error message has
|
||||||
|
been printed to stderr and something is not working
|
||||||
|
correctly. If the led is green everything is working ok.
|
||||||
|
|
||||||
|
Mute:
|
||||||
|
Right click on a volume controller to mute the sound
|
||||||
|
source. The button will then have a red led in one corner.
|
||||||
|
Right click again to restore the volume. If a muted sound
|
||||||
|
source is modified by another application Mixer.app will
|
||||||
|
automaticaly release its muted state.
|
||||||
|
|
||||||
|
Wheel mouse:
|
||||||
|
If you have a wheel mouse (where the wheel is configured as
|
||||||
|
Button4 and Button5) you can control the volume by just moving
|
||||||
|
the mouse over Mixer.app and roll the wheel up and down. Use
|
||||||
|
the command line option -w to specify which slider that should
|
||||||
|
react to the wheel movement.
|
||||||
|
|
||||||
|
Label:
|
||||||
|
If you run multiple instances of Mixer.app you might want
|
||||||
|
to be able to tell them apart. This can easily be done
|
||||||
|
by setting a label to each one of them. By using the -l
|
||||||
|
option you can add a little text label at the bottom of
|
||||||
|
the mixer.
|
||||||
|
|
||||||
|
Save volume settings:
|
||||||
|
Use the option -s or -S <file> if you want the volume
|
||||||
|
settings to be saved when Mixer.app exits, and then
|
||||||
|
loaded again when Mixer.app is started the next time.
|
||||||
|
When using -s the settings are saved in/loaded from
|
||||||
|
~/GNUstep/Defaults/Mixer. Use the -S <file> option
|
||||||
|
if you want to use a different file.
|
||||||
|
|
||||||
|
Bugs
|
||||||
|
--------------------------------------------------------------
|
||||||
|
If you discover any bugs in this software, please send a
|
||||||
|
bugreport to per@fukt.bth.se and describe the problem.
|
||||||
|
|
||||||
|
|
||||||
|
Special thanks to
|
||||||
|
--------------------------------------------------------------
|
||||||
|
David Sauer <davids@iol.cz>
|
||||||
|
Theo Schlossnagle <theo@omniti.com>
|
||||||
|
Alban Hertroys <dalroi@wit401310.student.utwente.nl>
|
||||||
|
|
||||||
|
|
||||||
|
Copyright
|
||||||
|
--------------------------------------------------------------
|
||||||
|
Mixer.app is copyright (c) 1998-2002 by Per Liden and is
|
||||||
|
licensed through the GNU General Public License. Read the
|
||||||
|
COPYING file for the complete license.
|
||||||
|
|
||||||
|
Minor parts of this code were taken from asmixer by Rob Malda
|
||||||
|
(malda@slashdot.org)
|
1
AlsaMixer.app/pixmaps
Symbolic link
1
AlsaMixer.app/pixmaps
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
skins/default
|
47
AlsaMixer.app/skins/barross@web.de/button.xpm
Normal file
47
AlsaMixer.app/skins/barross@web.de/button.xpm
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * button_xpm[] = {
|
||||||
|
"15 9 35 1",
|
||||||
|
" c None",
|
||||||
|
". c #DEDEE6",
|
||||||
|
"+ c #D5DAE6",
|
||||||
|
"@ c #D5D6E6",
|
||||||
|
"# c #CDD2DE",
|
||||||
|
"$ c #CDCEDE",
|
||||||
|
"% c #C5CAD5",
|
||||||
|
"& c #C5C6D5",
|
||||||
|
"* c #BDC2CD",
|
||||||
|
"= c #B4BECD",
|
||||||
|
"- c #BDBEC5",
|
||||||
|
"; c #C5CADE",
|
||||||
|
"> c #BDC6D5",
|
||||||
|
", c #BDBECD",
|
||||||
|
"' c #B4B6C5",
|
||||||
|
") c #ACB6C5",
|
||||||
|
"! c #ACB2C5",
|
||||||
|
"~ c #ACB2BD",
|
||||||
|
"{ c #ACAEBD",
|
||||||
|
"] c #8B8D9C",
|
||||||
|
"^ c #A4A5B4",
|
||||||
|
"/ c #9C9DAC",
|
||||||
|
"( c #94959C",
|
||||||
|
"_ c #8B919C",
|
||||||
|
": c #CDD2E6",
|
||||||
|
"< c #B4BAC5",
|
||||||
|
"[ c #BDC2D5",
|
||||||
|
"} c #B4BACD",
|
||||||
|
"| c #8B8D94",
|
||||||
|
"1 c #ACAAB4",
|
||||||
|
"2 c #9CA1AC",
|
||||||
|
"3 c #9C99A4",
|
||||||
|
"4 c #8B8994",
|
||||||
|
"5 c #B4BEC5",
|
||||||
|
"6 c #83858B",
|
||||||
|
"....++@@#$%&*=-",
|
||||||
|
".++@@#;>,')!~{]",
|
||||||
|
",~^/(__]]]]]]]]",
|
||||||
|
".+++@@:$%&*,,<]",
|
||||||
|
"++@:$&[}'!~{{~|",
|
||||||
|
"123(_]]]]]_]]]4",
|
||||||
|
"++@@@#;%>*,-<56",
|
||||||
|
"@@#;>*''!~~~~~6",
|
||||||
|
"/(__]]]_]]|]466"};
|
167
AlsaMixer.app/skins/barross@web.de/main.xpm
Normal file
167
AlsaMixer.app/skins/barross@web.de/main.xpm
Normal file
|
@ -0,0 +1,167 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * main_xpm[] = {
|
||||||
|
"64 64 100 2",
|
||||||
|
" c None",
|
||||||
|
". c #212121",
|
||||||
|
"+ c #222223",
|
||||||
|
"@ c #E6EAEE",
|
||||||
|
"# c #DEE6EE",
|
||||||
|
"$ c #DEE2EE",
|
||||||
|
"% c #DEE2E6",
|
||||||
|
"& c #D5E2E6",
|
||||||
|
"* c #D5DEE6",
|
||||||
|
"= c #D5DAE6",
|
||||||
|
"- c #D5DADE",
|
||||||
|
"; c #CDDADE",
|
||||||
|
"> c #CDD6DE",
|
||||||
|
", c #CDD2DE",
|
||||||
|
"' c #C5D2D5",
|
||||||
|
") c #C5CED5",
|
||||||
|
"! c #C5CAD5",
|
||||||
|
"~ c #BDCAD5",
|
||||||
|
"{ c #BDC6D5",
|
||||||
|
"] c #BDC6CD",
|
||||||
|
"^ c #BDC2CD",
|
||||||
|
"/ c #EEF2EE",
|
||||||
|
"( c #C5D2DE",
|
||||||
|
"_ c #5A5D62",
|
||||||
|
": c #5A6162",
|
||||||
|
"< c #5A595A",
|
||||||
|
"[ c #B4C2CD",
|
||||||
|
"} c #5A555A",
|
||||||
|
"| c #52555A",
|
||||||
|
"1 c #4A4C5A",
|
||||||
|
"2 c #B4BECD",
|
||||||
|
"3 c #EBEEEB",
|
||||||
|
"4 c #4A4C52",
|
||||||
|
"5 c #D5D6DE",
|
||||||
|
"6 c #4A505A",
|
||||||
|
"7 c #B4BEC5",
|
||||||
|
"8 c #E5E7E5",
|
||||||
|
"9 c #4A484A",
|
||||||
|
"0 c #E2E3E2",
|
||||||
|
"a c #4A444A",
|
||||||
|
"b c #E1E2E1",
|
||||||
|
"c c #41404A",
|
||||||
|
"d c #E1E1E1",
|
||||||
|
"e c #393C4A",
|
||||||
|
"f c #41444A",
|
||||||
|
"g c #393C41",
|
||||||
|
"h c #39404A",
|
||||||
|
"i c #C5CEDE",
|
||||||
|
"j c #393839",
|
||||||
|
"k c #B4BAC5",
|
||||||
|
"l c #393439",
|
||||||
|
"m c #313039",
|
||||||
|
"n c #293031",
|
||||||
|
"o c #B3B9C4",
|
||||||
|
"p c #ACBAC5",
|
||||||
|
"q c #D4DDE5",
|
||||||
|
"r c #292C31",
|
||||||
|
"s c #D4DAE1",
|
||||||
|
"t c #292829",
|
||||||
|
"u c #D5D6E6",
|
||||||
|
"v c #293039",
|
||||||
|
"w c #D2D8DE",
|
||||||
|
"x c #292429",
|
||||||
|
"y c #ACB6C5",
|
||||||
|
"z c #D1D6DC",
|
||||||
|
"A c #202429",
|
||||||
|
"B c #292C29",
|
||||||
|
"C c #ACB6BD",
|
||||||
|
"D c #D1D6D9",
|
||||||
|
"E c #182020",
|
||||||
|
"F c #C4CDD4",
|
||||||
|
"G c #D1D6D8",
|
||||||
|
"H c #181C20",
|
||||||
|
"I c #CFD4D8",
|
||||||
|
"J c #CED3D9",
|
||||||
|
"K c #ACB2BD",
|
||||||
|
"L c #CFD4DB",
|
||||||
|
"M c #D0D3DA",
|
||||||
|
"N c #313439",
|
||||||
|
"O c #CDD4DC",
|
||||||
|
"P c #CCD5DD",
|
||||||
|
"Q c #BCC5D4",
|
||||||
|
"R c #BCC5CC",
|
||||||
|
"S c #ACAEBD",
|
||||||
|
"T c #A4AEB4",
|
||||||
|
"U c #A4AEBD",
|
||||||
|
"V c #A4AAB4",
|
||||||
|
"W c #4A555A",
|
||||||
|
"X c #ACAEB4",
|
||||||
|
"Y c #5A5D5A",
|
||||||
|
"Z c #9CAAB4",
|
||||||
|
"` c #626162",
|
||||||
|
" . c #9CA5B4",
|
||||||
|
".. c #62656A",
|
||||||
|
"+. c #62696A",
|
||||||
|
"@. c #7B8183",
|
||||||
|
"#. c #6A6D73",
|
||||||
|
"$. c #9CA1AC",
|
||||||
|
"%. c #1F1E22",
|
||||||
|
"&. c #26D526",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" . . . . . . . . . . . . . . . . . . + + + + + + + + + + + + + + + + + + + + + . . . . . . . . . . . . . . . . . . . ",
|
||||||
|
" . @ @ @ @ @ # # # # # $ $ $ % % & & * * * * * * * = = = = - ; > > > > > , , , , ' ) ) ) ) ! ! ! ! ! ~ { ] ] ] ^ ^ / ",
|
||||||
|
" . @ @ @ @ # # # # # $ $ $ % % % & * * * * * * * = = = = - - > > > > > > , , , ( ) ) ) ) ) ! ! ! ! ~ { ] ] ] ] ^ ^ / ",
|
||||||
|
" . @ @ @ # # # # # $ $ $ % % % & & * * * * * * * = = = = = ; > > > > > > , , , , ' ) ) ) ! ! ! ! ~ { ] ] ] ] ] ^ ^ / ",
|
||||||
|
" . @ @ # # # # # $ $ $ % % % & & * * * * * * * = = = = = - > > > > > > , , , , ' ) ) ) ) ! ! ! ~ { ] ] ] ] ] ^ ^ ^ / ",
|
||||||
|
" . @ # # # # # $ $ $ _ / % % % * * * * * * * * = = = = = : / > > > > > , , , , ' ) ) ) ! ! ! _ / { ] ] ] ] ^ ^ ^ ^ / ",
|
||||||
|
" . # # # # # $ $ $ $ < / % % * * * * * * * * = = = = = - _ / > > > > > , , , ( ) ) ) ) ) ! ! < / ] ] ] ] ^ ^ ^ ^ [ / ",
|
||||||
|
" . # # # # $ $ $ $ $ } / % * * * * * * * * = * = = = = = < / > > > > , , , , ( ) ) ) ) ! ! ! } / ] ] ] ^ ^ ^ ^ ^ [ / ",
|
||||||
|
" . # # # $ $ $ $ $ % | / & * * * * * * * * * = = = = = - < / > > > > > , , , ' ) ) ) ) ! ! ~ | / ] ] ^ ^ ^ ^ ^ [ [ / ",
|
||||||
|
" . # # $ $ $ $ % % % 1 / & * * * * * * * * * = = = = = - | / > > > > , , , , ) ) ) ) ! ! ! ! 1 / ] ] ^ ^ ^ ^ [ [ 2 3 ",
|
||||||
|
" . # $ $ $ $ % % % % 4 / * * * * * * * * * = = = = = - 5 6 / > > > > , , , , ) ) ) ) ! ! ! ~ 4 / ] ^ ^ ^ ^ [ [ 2 7 8 ",
|
||||||
|
" . $ $ $ $ % % % % & 9 / * * * * * * * * = = = = = = = 5 4 / > > > , , , , ( ) ) ) ) ! ! ! ~ 9 / ] ] ^ ^ ^ [ 2 7 7 0 ",
|
||||||
|
" . $ $ $ % % % % & & a / * * * * * * * = = = = = = = - 5 9 / > > > , , , , ' ) ) ) ) ! ! ~ { a / ] ^ ^ ^ [ 2 7 7 7 b ",
|
||||||
|
" . $ $ % % % & & & * c / * * * * * * = = = = = = = = - > 9 / > > > > , , ( ) ) ) ) ) ! ! ~ { c / ] ^ ^ ^ [ 2 7 7 7 d ",
|
||||||
|
" . $ % % % & & * * * e / * * * * * = * = = = = = = - 5 > f / > > > , , , ( ) ) ) ) ! ! ! { { e / ^ ^ ^ [ [ 2 7 7 7 d ",
|
||||||
|
" . % % % & & * * * * g / * * * * = * = = = = = = - = > > h / > > > , , , i ) ) ) ) ! ! ~ ~ ] g / ^ ^ ^ ^ 2 7 7 7 7 d ",
|
||||||
|
" . % & & & * * * * * j / * * * = * = = = = = = = = 5 > > g / > > , , , , ' ) ) ) ! ! ! ! { ] j / ^ ^ ^ [ 2 7 7 7 k d ",
|
||||||
|
" . & & * * * * * * * l / * * * * = = = = = = = = - 5 > > g / > > , , , ( ) ) ) ) ! ! ! ~ ] ] l / ^ ^ ^ 2 7 7 7 k k b ",
|
||||||
|
" . * * * * * * * * * m / * * * = = = = = = = = = 5 5 > > j / > , , , , ' ) ) ) ) ! ! ~ { ] ] m / ^ ^ [ 7 7 7 7 k k 0 ",
|
||||||
|
" . * * * * * * * * * n / * = = = = = = = = = = 5 - > > > l / > > , , , i ) ) ) ! ! ! ~ { ] ] n / ^ [ 2 2 7 7 o k p 8 ",
|
||||||
|
" . q * * * * * * * * r / = = = = = = = = = = 5 - > > > > m / > , , , ( ) ) ) ) ! ! ~ { ] ] ] r / ^ [ 2 7 7 7 k k p 3 ",
|
||||||
|
" . s * * * * * * * * t / = = = = = = = = = u - > > > > > v / > , , , i ) ) ) ! ! ! ~ { ] ] ^ t / ^ [ 7 7 7 k k p p / ",
|
||||||
|
" . w * * * * = * = = x / = = = = = = = - = - > > > > > > n / , , , , ' ) ) ) ! ! ~ ~ ] ] ] ^ x / ^ 2 7 7 k k k p y / ",
|
||||||
|
" . z * * = = = = = = A / = = = = = = 5 - 5 > > > > > > > B / , , , , ) ) ) ! ! ! ~ ] ] ] ^ ^ A / [ 7 7 7 k k k y C / ",
|
||||||
|
" . D = = = = = = = = E / = = = = 5 - - > > > > > > > > > t / , , , ( ) ) F ! ! ! { ] ] ] ^ ^ E / 2 7 7 7 k k p C C / ",
|
||||||
|
" + G = = = = = = = = H / - = - 5 - > > > > > > > > > > > t / , , ( ) ) ) ) ! ! ~ { ] ] ] ^ ^ H / 2 7 7 k k p y C C / ",
|
||||||
|
" + I = = = = = = = = E / 5 5 5 > > > > > > > > > > > > > B / , , i ) ) ) ! ! ! { ] ] ] ^ ^ ^ E / 7 7 7 k k p y C C / ",
|
||||||
|
" + I = = = = - = - - A / 5 > > > > > > > > > > > > > > > r / , ( ) ) ) ) ! ! ~ ] ] ] ^ ^ ^ [ A / 7 7 k k p p C C C / ",
|
||||||
|
" . J = = - = - ; > 5 x / > > > > > > > > > > > > , > , , n / ( ' ) ) ) ! ! ~ ~ ] ] ] ^ ^ ^ [ x / 7 k k p p C C C K / ",
|
||||||
|
" . L - - - > > > > > t / > > > > > > > > > > , > , , , , m / ' ) ) ) ! ! ! ~ ] ] ] ^ ^ ^ [ 2 t / k k k p y C C K K / ",
|
||||||
|
" . M - > > > > > > > r / > > > > > > > , , , , , , , , ( N / ) ) ) ! ! ! ~ { ] ] ^ ^ ^ [ [ 2 r / k k p p C C C K K / ",
|
||||||
|
" . O > > P P > > > > n / > > > > > > , , , , , , , , ( ' j / ) ) ! ! ! ! Q ] ] ^ ^ ^ ^ [ 2 7 n / k p p y C C K K K / ",
|
||||||
|
" . > > > > > > > > > m / > > > , , , , , , , , ( ( ) ) ) j / ) ! ! ! ! { R ] ] ^ ^ ^ ^ 2 7 7 m / k p y C C C K K S / ",
|
||||||
|
" . > > > > > > > > > l / > , , , , , , , , ( ( ) ) ) ) ) g / ! ! ! ! { ] ] ] ^ ^ ^ ^ 2 7 7 7 l / p y C C C K K S S / ",
|
||||||
|
" . > > > > > > > , , j / , , , , , , , ( ' ) ) ) ) ) ) ) h / ! ! ~ { ] ] ] ^ ^ ^ ^ [ 2 7 7 k j / y y C C K K K S S / ",
|
||||||
|
" . > > > > > , , , , g / , , , , , ( ) ) ) ) ) ) ) ) ! ! f / ! ~ { ] ] ] ^ ^ ^ ^ [ 2 7 7 7 k g / y C C C K K S S S / ",
|
||||||
|
" . > > , , , , , , , h / , , ' ' ) ) ) ) ) ) ) ) ) ! ! ! a / ~ { ] ] ] ^ ^ ^ ^ [ 2 7 7 7 k k h / C C C K K K S S T / ",
|
||||||
|
" . , , , , , , , , , f / ' ' ) ) ) ) ) ) ) ) ) ! ! ! ! ! 9 / ] ] ] ] ^ ^ ^ ^ [ 2 2 7 7 k k p f / C C K K K S S T T / ",
|
||||||
|
" . , , , , , , ( ' ( a / ) ) ) ) ) ) ) ) ) ! ! ! ! ! ! ~ 9 / ] ] ] ^ ^ ^ ^ [ 2 2 7 7 k k p p a / C K K K S S U T V / ",
|
||||||
|
" . , , , , ( ' ) ) ) 9 / ) ) ) ) ) ) ) ! ! ! ! ! ! ~ { { 4 / ] ] ^ ^ ^ ^ [ 2 7 7 7 k k p p C 9 / K K K S S S T T V / ",
|
||||||
|
" . , ( ( ' ) ) ) ) ) 4 / ) ) ) ) ! ! ! ! ! ~ ! ~ { { ] ] W / ^ ^ ^ ^ ^ [ 2 7 7 7 k k p p y C 4 / K K S S S T T V V / ",
|
||||||
|
" . ( ' ) ) ) ) ) ) ) 6 / ) ) ! ! ! ! ! ! ! ~ { ] ] ] ] ] | / ^ ^ ^ [ [ 2 7 7 7 k k p p y C C 6 / K K S S X T V V V / ",
|
||||||
|
" . ' ) ) ) ) ) ) ) ) | / ! ! ! ! ! ! ~ ~ { { ] ] ] ] ] ^ < / ^ ^ [ [ 2 7 7 7 k k p p y C C C | / K S S S T V V V V / ",
|
||||||
|
" . ) ) ) ) ) ) ) ! ! < / ! ! ! ~ ~ ~ { { ] ] ] ] ] ] ^ ^ Y / [ [ 2 2 7 7 7 k k p p y C C C K < / S S S T T V V V Z / ",
|
||||||
|
" . ) ) ) ) ) ! ! ! ! < / ! ~ ~ ~ ] { ] ] ] ] ] ] ^ ^ ^ ^ _ / [ 7 7 7 7 7 k k k p y C C C K K < / S S T T V V V Z Z / ",
|
||||||
|
" . ) ) ) ! ! ! ! ! ! _ / ~ { ] { ] ] ] ] ] ] ^ ^ ^ ^ ^ [ ` / 7 7 7 7 7 k k p y y C C C K K K _ / S T T V V V Z Z ./ ",
|
||||||
|
" . ) ) ! ! ! ! ! ~ ~ ` / { ] ] ] ] ] ] ] ^ ^ ^ ^ ^ ^ [ [ ../ 7 7 7 k k k p y y C C C K K K S ` / T T V V V Z Z . ./ ",
|
||||||
|
" . ) ! ! ! ! ! ~ ~ { ../ ] ] ] ] ] ^ ^ ^ ^ ^ ^ ^ [ [ 2 7 +./ 7 7 k k k p y C C C C K K K S S ../ T V V V Z Z . . ./ ",
|
||||||
|
" . ! ! ! ! ! ~ { { ] @./ ] ] ] ^ ^ ^ ^ ^ ^ ^ [ [ [ 2 7 7 #./ 7 k k k p y C C C C K K K S S S +./ V V V Z Z . . . ./ ",
|
||||||
|
" . ! ! ! ! ~ { { ] ] ] ] ^ ^ ^ ^ ^ ^ ^ ^ ^ [ [ 2 7 7 7 7 7 k k k p p y C C C C K K K S S S T T V V V Z Z . . . . ./ ",
|
||||||
|
" . ! ! ~ ~ { { ] ] ] ] ^ ^ ^ ^ ^ ^ ^ [ [ [ 2 7 7 7 7 k k k k k p y y C C C K K K K S S X T T V V V Z Z . . . . .$./ ",
|
||||||
|
" . ! ~ ~ { { ] ] ] ] ^ ^ ^ ^ ^ ^ [ [ 2 7 2 7 7 7 7 7 k k k p p y C C C C K K K K S S U T V V V V Z Z . . . . .$.$./ ",
|
||||||
|
" . ~ ~ { { ] ] ] ] ^ ^ ^ ^ ^ [ [ 2 2 2 7 7 7 7 k k k k k p y y C C C K K K K S S S S T T V V V Z Z . . . . .$.$.$./ ",
|
||||||
|
" . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ",
|
||||||
|
" %. %. %. %. %. %.%.%. %.%.%. ",
|
||||||
|
" %.%. %.%. %. %. %. %. %. %. %.%.%.%. ",
|
||||||
|
" %. %. %. %. %.%. %.%.%. %.%.%. %.&.&.&. ",
|
||||||
|
" %. %. %. %. %. %. %. %. %.&.&.&. ",
|
||||||
|
" %. %. %. %. %. %.%.%. %. %. ",
|
||||||
|
" ",
|
||||||
|
" "};
|
64
AlsaMixer.app/skins/barross@web.de/mutebutton.xpm
Normal file
64
AlsaMixer.app/skins/barross@web.de/mutebutton.xpm
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * mutebutton_xpm[] = {
|
||||||
|
"16 9 52 1",
|
||||||
|
" c None",
|
||||||
|
". c #DEDEE6",
|
||||||
|
"+ c #D5DAE6",
|
||||||
|
"@ c #D5D6E6",
|
||||||
|
"# c #CDD2DE",
|
||||||
|
"$ c #CDCEDE",
|
||||||
|
"% c #C5CAD5",
|
||||||
|
"& c #C5C6D5",
|
||||||
|
"* c #BDC2CD",
|
||||||
|
"= c #B4BECD",
|
||||||
|
"- c #BDBEC5",
|
||||||
|
"; c #C5CADE",
|
||||||
|
"> c #BDC6D5",
|
||||||
|
", c #BDBECD",
|
||||||
|
"' c #B4B6C5",
|
||||||
|
") c #ACB6C5",
|
||||||
|
"! c #ACB2C5",
|
||||||
|
"~ c #ACB2BD",
|
||||||
|
"{ c #ACAEBD",
|
||||||
|
"] c #8B8D9C",
|
||||||
|
"^ c #A4A5B4",
|
||||||
|
"/ c #9C9DAC",
|
||||||
|
"( c #94959C",
|
||||||
|
"_ c #8B919C",
|
||||||
|
": c #CDD2E6",
|
||||||
|
"< c #B4BAC5",
|
||||||
|
"[ c #BDC2D5",
|
||||||
|
"} c #B4BACD",
|
||||||
|
"| c #8B8D94",
|
||||||
|
"1 c #ACAAB4",
|
||||||
|
"2 c #9CA1AC",
|
||||||
|
"3 c #9C99A4",
|
||||||
|
"4 c #C07681",
|
||||||
|
"5 c #DC5156",
|
||||||
|
"6 c #ED3638",
|
||||||
|
"7 c #D14648",
|
||||||
|
"8 c #96555B",
|
||||||
|
"9 c #DA585D",
|
||||||
|
"0 c #F35F5E",
|
||||||
|
"a c #FB3A39",
|
||||||
|
"b c #FB2324",
|
||||||
|
"c c #B31818",
|
||||||
|
"d c #D4585C",
|
||||||
|
"e c #F71A1C",
|
||||||
|
"f c #FE1212",
|
||||||
|
"g c #FF1313",
|
||||||
|
"h c #D70E0E",
|
||||||
|
"i c #9E5C64",
|
||||||
|
"j c #C61A1D",
|
||||||
|
"k c #DB1010",
|
||||||
|
"l c #F80E0E",
|
||||||
|
"m c #CB0C0C",
|
||||||
|
".....++@@#$%&*=-",
|
||||||
|
"..++@@#;>,')!~{]",
|
||||||
|
".,~^/(__]]]]]]]]",
|
||||||
|
"..+++@@:$%&*,,<]",
|
||||||
|
".++@:$&[}'!~{{~|",
|
||||||
|
".123(_]]]]]45678",
|
||||||
|
".++@@@#;%>*90abc",
|
||||||
|
"+@@#;>*''!~defgh",
|
||||||
|
"+/(__]]]_]]ijklm"};
|
7
AlsaMixer.app/skins/barross@web.de/redlight.xpm
Normal file
7
AlsaMixer.app/skins/barross@web.de/redlight.xpm
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * redlight_xpm[] = {
|
||||||
|
"3 2 2 1",
|
||||||
|
" c None",
|
||||||
|
". c #FF0000",
|
||||||
|
"...",
|
||||||
|
"..."};
|
29
AlsaMixer.app/skins/default/button.xpm
Normal file
29
AlsaMixer.app/skins/default/button.xpm
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * button_xpm[] = {
|
||||||
|
"16 9 17 1",
|
||||||
|
" c None",
|
||||||
|
". c #B7BAC7",
|
||||||
|
"+ c #848694",
|
||||||
|
"@ c #838593",
|
||||||
|
"# c #828392",
|
||||||
|
"$ c #808290",
|
||||||
|
"% c #7F818F",
|
||||||
|
"& c #7E808E",
|
||||||
|
"* c #7C7E8C",
|
||||||
|
"= c #7B7D8B",
|
||||||
|
"- c #7A7C8A",
|
||||||
|
"; c #787A88",
|
||||||
|
"> c #777987",
|
||||||
|
", c #767886",
|
||||||
|
"' c #747784",
|
||||||
|
") c #737583",
|
||||||
|
"! c #000000",
|
||||||
|
"................",
|
||||||
|
".+@#$%&*=-;>,')!",
|
||||||
|
".!!!!!!!!!!!!!!!",
|
||||||
|
"...............!",
|
||||||
|
".+@#$%&*=-;>,')!",
|
||||||
|
".!!!!!!!!!!!!!!!",
|
||||||
|
"...............!",
|
||||||
|
".+@#$%&*=-;>,')!",
|
||||||
|
".!!!!!!!!!!!!!!!"};
|
261
AlsaMixer.app/skins/default/main.xpm
Normal file
261
AlsaMixer.app/skins/default/main.xpm
Normal file
|
@ -0,0 +1,261 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * main_xpm[] = {
|
||||||
|
"64 64 194 2",
|
||||||
|
" c None",
|
||||||
|
". c #000000",
|
||||||
|
"+ c #2F2542",
|
||||||
|
"@ c #302643",
|
||||||
|
"# c #322745",
|
||||||
|
"$ c #332846",
|
||||||
|
"% c #342948",
|
||||||
|
"& c #352A49",
|
||||||
|
"* c #362B4B",
|
||||||
|
"= c #372C4C",
|
||||||
|
"- c #382D4E",
|
||||||
|
"; c #392E4F",
|
||||||
|
"> c #3A2E50",
|
||||||
|
", c #3B2F52",
|
||||||
|
"' c #3C3053",
|
||||||
|
") c #3C3154",
|
||||||
|
"! c #3D3155",
|
||||||
|
"~ c #3E3256",
|
||||||
|
"{ c #3F3357",
|
||||||
|
"] c #3F3358",
|
||||||
|
"^ c #403459",
|
||||||
|
"/ c #41345A",
|
||||||
|
"( c #41355A",
|
||||||
|
"_ c #41355B",
|
||||||
|
": c #42355B",
|
||||||
|
"< c #42365C",
|
||||||
|
"[ c #43365D",
|
||||||
|
"} c #B7BAC7",
|
||||||
|
"| c #312745",
|
||||||
|
"1 c #352A4A",
|
||||||
|
"2 c #372C4D",
|
||||||
|
"3 c #392F50",
|
||||||
|
"4 c #3B3052",
|
||||||
|
"5 c #43365C",
|
||||||
|
"6 c #43375E",
|
||||||
|
"7 c #44375E",
|
||||||
|
"8 c #44375F",
|
||||||
|
"9 c #44385F",
|
||||||
|
"0 c #45385F",
|
||||||
|
"a c #3A2F51",
|
||||||
|
"b c #322846",
|
||||||
|
"c c #392E50",
|
||||||
|
"d c #3A2F52",
|
||||||
|
"e c #453860",
|
||||||
|
"f c #463961",
|
||||||
|
"g c #3C3054",
|
||||||
|
"h c #3B3053",
|
||||||
|
"i c #332948",
|
||||||
|
"j c #403358",
|
||||||
|
"k c #463962",
|
||||||
|
"l c #473A62",
|
||||||
|
"m c #473A63",
|
||||||
|
"n c #483A63",
|
||||||
|
"o c #473963",
|
||||||
|
"p c #483A64",
|
||||||
|
"q c #3D3154",
|
||||||
|
"r c #332947",
|
||||||
|
"s c #342A49",
|
||||||
|
"t c #2E2F40",
|
||||||
|
"u c #9F9FB1",
|
||||||
|
"v c #483B64",
|
||||||
|
"w c #493B65",
|
||||||
|
"x c #493C65",
|
||||||
|
"y c #493C66",
|
||||||
|
"z c #303143",
|
||||||
|
"A c #A1A1B3",
|
||||||
|
"B c #2F2F40",
|
||||||
|
"C c #352B4A",
|
||||||
|
"D c #483B65",
|
||||||
|
"E c #4A3C66",
|
||||||
|
"F c #4A3C67",
|
||||||
|
"G c #4A3D67",
|
||||||
|
"H c #4B3D67",
|
||||||
|
"I c #4B3D68",
|
||||||
|
"J c #313143",
|
||||||
|
"K c #A1A1B4",
|
||||||
|
"L c #2F3041",
|
||||||
|
"M c #362B4C",
|
||||||
|
"N c #382D4D",
|
||||||
|
"O c #43375D",
|
||||||
|
"P c #4B3E69",
|
||||||
|
"Q c #4C3E69",
|
||||||
|
"R c #4C3E6A",
|
||||||
|
"S c #313244",
|
||||||
|
"T c #A2A1B4",
|
||||||
|
"U c #4C3F6A",
|
||||||
|
"V c #392D4F",
|
||||||
|
"W c #A0A0B2",
|
||||||
|
"X c #453960",
|
||||||
|
"Y c #4D3F6A",
|
||||||
|
"Z c #4D3F6B",
|
||||||
|
"` c #4E406C",
|
||||||
|
" . c #A2A2B5",
|
||||||
|
".. c #4F406D",
|
||||||
|
"+. c #4F416D",
|
||||||
|
"@. c #4F416E",
|
||||||
|
"#. c #323245",
|
||||||
|
"$. c #50416E",
|
||||||
|
"%. c #303042",
|
||||||
|
"&. c #382C4D",
|
||||||
|
"*. c #4D3F6C",
|
||||||
|
"=. c #4E406D",
|
||||||
|
"-. c #50426F",
|
||||||
|
";. c #504270",
|
||||||
|
">. c #514270",
|
||||||
|
",. c #A3A2B6",
|
||||||
|
"'. c #514371",
|
||||||
|
"). c #2F3042",
|
||||||
|
"!. c #524371",
|
||||||
|
"~. c #524372",
|
||||||
|
"{. c #524472",
|
||||||
|
"]. c #534473",
|
||||||
|
"^. c #323345",
|
||||||
|
"/. c #303142",
|
||||||
|
"(. c #A0A0B3",
|
||||||
|
"_. c #534574",
|
||||||
|
":. c #544574",
|
||||||
|
"<. c #544575",
|
||||||
|
"[. c #333346",
|
||||||
|
"}. c #A3A3B6",
|
||||||
|
"|. c #A1A0B3",
|
||||||
|
"1. c #554676",
|
||||||
|
"2. c #564777",
|
||||||
|
"3. c #A3A3B7",
|
||||||
|
"4. c #50416F",
|
||||||
|
"5. c #554675",
|
||||||
|
"6. c #574778",
|
||||||
|
"7. c #574879",
|
||||||
|
"8. c #333347",
|
||||||
|
"9. c #A4A3B7",
|
||||||
|
"0. c #58497A",
|
||||||
|
"a. c #58497B",
|
||||||
|
"b. c #59497B",
|
||||||
|
"c. c #343447",
|
||||||
|
"d. c #A4A3B8",
|
||||||
|
"e. c #3E3257",
|
||||||
|
"f. c #564778",
|
||||||
|
"g. c #594A7C",
|
||||||
|
"h. c #5A4A7D",
|
||||||
|
"i. c #5A4B7D",
|
||||||
|
"j. c #343448",
|
||||||
|
"k. c #A4A4B8",
|
||||||
|
"l. c #5B4B7E",
|
||||||
|
"m. c #313144",
|
||||||
|
"n. c #5C4C7F",
|
||||||
|
"o. c #A5A4B9",
|
||||||
|
"p. c #5C4C80",
|
||||||
|
"q. c #5A4A7C",
|
||||||
|
"r. c #5D4D81",
|
||||||
|
"s. c #5D4D82",
|
||||||
|
"t. c #353448",
|
||||||
|
"u. c #5E4D82",
|
||||||
|
"v. c #5E4E83",
|
||||||
|
"w. c #5F4F84",
|
||||||
|
"x. c #353549",
|
||||||
|
"y. c #A5A5B9",
|
||||||
|
"z. c #5E4E82",
|
||||||
|
"A. c #604F85",
|
||||||
|
"B. c #615086",
|
||||||
|
"C. c #A6A5BA",
|
||||||
|
"D. c #605086",
|
||||||
|
"E. c #615187",
|
||||||
|
"F. c #625188",
|
||||||
|
"G. c #35354A",
|
||||||
|
"H. c #625288",
|
||||||
|
"I. c #323244",
|
||||||
|
"J. c #625187",
|
||||||
|
"K. c #635289",
|
||||||
|
"L. c #63528A",
|
||||||
|
"M. c #36364A",
|
||||||
|
"N. c #A6A5BB",
|
||||||
|
"O. c #64538B",
|
||||||
|
"P. c #64538A",
|
||||||
|
"Q. c #65548C",
|
||||||
|
"R. c #36364B",
|
||||||
|
"S. c #A7A6BB",
|
||||||
|
"T. c #66548D",
|
||||||
|
"U. c #66558D",
|
||||||
|
"V. c #A7A6BC",
|
||||||
|
"W. c #67558F",
|
||||||
|
"X. c #685790",
|
||||||
|
"Y. c #584879",
|
||||||
|
"Z. c #59497C",
|
||||||
|
"`. c #67568F",
|
||||||
|
" + c #37364B",
|
||||||
|
".+ c #A8A6BD",
|
||||||
|
"++ c #695791",
|
||||||
|
"@+ c #2E2F3F",
|
||||||
|
"#+ c #9F9FB0",
|
||||||
|
"$+ c #382E4E",
|
||||||
|
"%+ c #42355C",
|
||||||
|
"&+ c #2E2440",
|
||||||
|
"*+ c #292039",
|
||||||
|
"=+ c #00FF29",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
|
||||||
|
" . + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < < [ [ [ [ [ [ [ < < : _ ( / ^ ] { ~ ! ) ' , > ; - = * & % $ # @ } ",
|
||||||
|
" . @ | $ % 1 * 2 - ; 3 4 ' ! ~ { ] ^ / _ < 5 [ 6 7 7 8 9 7 0 0 9 8 7 7 6 [ 5 < _ / ^ ] { ~ ! , 4 a ; - 2 * 1 % $ | } ",
|
||||||
|
" . | b % & * 2 - c a d ) ! ~ ] ^ / : < [ 6 7 0 e e f f f e f f f f f e e 0 7 6 [ < : / ^ ] ~ g ) h a c - 2 * & % b } ",
|
||||||
|
" . b i & * 2 - c a ' ' ~ { j ^ _ < [ 7 9 e f f k l m m n o p p n m m l k f f e 9 7 [ < _ ^ j ~ ~ q ' a c - 2 * & i } ",
|
||||||
|
" . r s * = - c a ' q t u ^ / : [ 6 8 e f k m n v v w x y z A y y x w v v n m k f e 8 6 [ : / B u ~ q ' a c - = * s } ",
|
||||||
|
" . s C = - ; a ' q ~ t u ( < [ 7 e f k m v D x E F G H I J K I I H G F E x D v m k f e 7 [ < L u { ~ q ' a ; - = C } ",
|
||||||
|
" . 1 M N ; a h q ~ { B u < O 8 e f m v w y F H I P Q R R S T U R R Q P I H F y w v m f e 8 O L u ^ { ~ q h a ; N M } ",
|
||||||
|
" . * 2 V > 4 ) ~ { ^ L W 6 9 X k m v y F I P Q Y Z Z ` ` S .` ` ` Z Z Y Q P I F y v m k X 9 L W ( ^ { ~ ) 4 > V 2 } ",
|
||||||
|
" . = - c , ' ! { ^ ( L W 0 f l p w E H P R Z Z ` ..+.@.@.#. .$.@.@.+...` Z Z R P H E w p l f %.W < ( ^ { ! ' , c - } ",
|
||||||
|
" . &.; a ' ! ~ j / < L W f l v w F I Q Y *.=.+.$.-.;.>.>.#.,.'.>.>.;.-.$.+.=.*.Y Q I F w v l %.W O < / j ~ ! ' a ; } ",
|
||||||
|
" . - > 4 ) ~ ] ^ : [ ).W l v x G I R Z ` +.$.-.>.!.~.{.].^.,.].].{.~.!.>.-.$.+.` Z R I G x v /.W 8 [ : ^ ] ~ ) 4 > } ",
|
||||||
|
" . ; a ' ! { ^ _ [ 7 %.(.p w G I R Z =.@.-.>.!.{.]._.:.<.[.}.<.<.:._.].{.!.>.-.@.=.Z R I G w z (.e 7 [ _ ^ { ! ' a } ",
|
||||||
|
" . > 4 q ~ ] / < 6 e %.|.w F I R Z ..$.>.!.{.].:.<.1.1.2.[.3.2.2.1.1.<.:.].{.!.>.$...Z R I F z |.f e 6 < / ] ~ q 4 } ",
|
||||||
|
" . a ' ! { ^ : [ 8 f /.A E I R Z ..4.>.!.].:.5.1.2.6.7.7.8.9.7.7.7.6.2.1.5.:.].!.>.4...Z R I J A m f 8 [ : ^ { ! ' } ",
|
||||||
|
" . , ) ~ ] / < 7 e k z A H Q Z =.$.>.~.].<.1.2.6.7.0.a.b.c.d.b.b.a.0.7.6.2.1.<.].~.>.$.=.Z Q J A v k e 7 < / ] ~ ) } ",
|
||||||
|
" . ' ! e.^ _ [ 9 f m z K P Y ` @.>.!.].<.1.f.7.0.b.g.h.i.j.k.l.i.h.g.b.0.7.f.1.<.].!.>.@.` Y m.K w m f 9 [ _ ^ e.! } ",
|
||||||
|
" . ' ~ ] / < 6 e k v z K R *.+.-.!.].<.1.f.7.a.g.h.l.n.n.j.o.p.n.n.l.h.g.a.7.f.1.<.].!.-.+.*.m.K y v k e 6 < / ] ~ } ",
|
||||||
|
" . ) ~ j ( 5 7 f m D J K Z =.$.>.{.:.1.f.7.b.q.l.n.p.r.s.t.o.u.s.r.p.n.l.q.b.7.f.1.:.{.>.$.=.S K F D m f 7 5 ( j ~ } ",
|
||||||
|
" . ! e.^ _ [ 0 f n x J T Z +.-.!.].5.2.7.a.q.l.n.r.u.v.w.x.y.w.w.v.u.r.n.l.q.a.7.2.5.].!.-.+.S T H x n f 0 [ _ ^ e.} ",
|
||||||
|
" . ! { ^ : 6 e k v E J T ` $.>.{.:.1.6.0.g.l.n.r.z.w.A.B.x.C.B.B.A.w.z.r.n.l.g.0.6.1.:.{.>.$.S T I E v k e 6 : ^ { } ",
|
||||||
|
" . ~ ] / < 7 e l v F m.T ..-.!.].<.2.7.b.h.n.r.z.w.D.E.F.G.C.H.F.E.D.w.z.r.n.h.b.7.2.<.].!.-.I.T P F v l e 7 < / ] } ",
|
||||||
|
" . ~ ] ( < 7 f m w G m.T +.;.~._.1.6.0.g.l.p.u.w.D.J.K.L.M.N.O.L.K.J.D.w.u.p.l.g.0.6.1._.~.;.I.T Q G w m f 7 < ( ] } ",
|
||||||
|
" . ~ j ( [ 8 f m x H m. .@.>.{.:.1.7.a.h.n.r.v.A.E.K.P.Q.R.S.T.Q.P.K.E.A.v.r.n.h.a.7.1.:.{.>.#. .R H x m f 8 [ ( j } ",
|
||||||
|
" . ~ ^ _ [ 9 f n y I m. .@.>.].<.2.7.b.i.n.s.w.B.F.L.Q.U.R.V.W.U.Q.L.F.B.w.s.n.i.b.7.2.<.].>.#. .R I y n f 9 [ _ ^ } ",
|
||||||
|
" . ~ ^ _ [ 0 f p y I S .$.'.].<.2.7.b.l.p.u.w.B.H.O.T.W.R.V.X.W.T.O.H.B.w.u.p.l.b.7.2.<.].'.#. .U I y p f 0 [ _ ^ } ",
|
||||||
|
" . e.^ _ [ 0 f p y I S .$.'.].<.2.Y.Z.l.p.z.w.B.K.O.T.`. +.+++`.T.O.K.B.w.z.p.l.Z.Y.2.<.].'.#. .U I y p f 0 [ _ ^ } ",
|
||||||
|
" . ~ ^ _ [ 0 f p y I S .$.'.].<.2.7.b.l.p.u.w.B.H.O.T.W.R.V.X.W.T.O.H.B.w.u.p.l.b.7.2.<.].'.#. .U I y p f 0 [ _ ^ } ",
|
||||||
|
" . ~ ^ _ [ 9 f n y I m. .@.>.].<.2.7.b.i.n.s.w.B.F.L.Q.U.R.V.W.U.Q.L.F.B.w.s.n.i.b.7.2.<.].>.#. .R I y n f 9 [ _ ^ } ",
|
||||||
|
" . ~ j ( [ 8 f m x H m. .@.>.{.:.1.7.a.h.n.r.v.A.E.K.P.Q.R.S.T.Q.P.K.E.A.v.r.n.h.a.7.1.:.{.>.#. .R H x m f 8 [ ( j } ",
|
||||||
|
" . ~ ] ( < 7 f m w G m.T +.;.~._.1.6.0.g.l.p.u.w.D.J.K.L.M.N.O.L.K.J.D.w.u.p.l.g.0.6.1._.~.;.I.T Q G w m f 7 < ( ] } ",
|
||||||
|
" . ~ ] / < 7 e l v F m.T ..-.!.].<.2.7.b.h.n.r.z.w.D.E.F.G.C.H.F.E.D.w.z.r.n.h.b.7.2.<.].!.-.I.T P F v l e 7 < / ] } ",
|
||||||
|
" . ! { ^ : 6 e k v E J T ` $.>.{.:.1.6.0.g.l.n.r.z.w.A.B.x.C.B.B.A.w.z.r.n.l.g.0.6.1.:.{.>.$.S T I E v k e 6 : ^ { } ",
|
||||||
|
" . ! e.^ _ [ 0 f n x J T Z +.-.!.].5.2.7.a.q.l.n.r.u.v.w.x.y.w.w.v.u.r.n.l.q.a.7.2.5.].!.-.+.S T H x n f 0 [ _ ^ e.} ",
|
||||||
|
" . ) ~ j ( 5 7 f m D J K Z =.$.>.{.:.1.f.7.b.q.l.n.p.r.s.t.o.u.s.r.p.n.l.q.b.7.f.1.:.{.>.$.=.S K F D m f 7 5 ( j ~ } ",
|
||||||
|
" . ' ~ ] / < 6 e k v z K R *.+.-.!.].<.1.f.7.a.g.h.l.n.n.j.o.p.n.n.l.h.g.a.7.f.1.<.].!.-.+.*.m.K y v k e 6 < / ] ~ } ",
|
||||||
|
" . ' ! e.^ _ [ 9 f m z K P Y ` @.>.!.].<.1.f.7.0.b.g.h.i.j.k.l.i.h.g.b.0.7.f.1.<.].!.>.@.` Y m.K w m f 9 [ _ ^ e.! } ",
|
||||||
|
" . , ) ~ ] / < 7 e k z A H Q Z =.$.>.~.].<.1.2.6.7.0.a.b.c.d.b.b.a.0.7.6.2.1.<.].~.>.$.=.Z Q J A v k e 7 < / ] ~ ) } ",
|
||||||
|
" . a ' ! { ^ : [ 8 f /.A E I R Z ..4.>.!.].:.5.1.2.6.7.7.8.9.7.7.7.6.2.1.5.:.].!.>.4...Z R I J A m f 8 [ : ^ { ! ' } ",
|
||||||
|
" . > 4 q ~ ] / < 6 e %.|.w F I R Z ..$.>.!.{.].:.<.1.1.2.[.3.2.2.1.1.<.:.].{.!.>.$...Z R I F z |.f e 6 < / ] ~ q 4 } ",
|
||||||
|
" . ; a ' ! { ^ _ [ 7 %.(.p w G I R Z =.@.-.>.!.{.]._.:.<.[.}.<.<.:._.].{.!.>.-.@.=.Z R I G w z (.e 7 [ _ ^ { ! ' a } ",
|
||||||
|
" . - > 4 ) ~ ] ^ : [ ).W l v x G I R Z ` +.$.-.>.!.~.{.].^.,.].].{.~.!.>.-.$.+.` Z R I G x v /.W 8 [ : ^ ] ~ ) 4 > } ",
|
||||||
|
" . &.; a ' ! ~ j / < L W f l v w F I Q Y *.=.+.$.-.;.>.>.#.,.'.>.>.;.-.$.+.=.*.Y Q I F w v l %.W O < / j ~ ! ' a ; } ",
|
||||||
|
" . = - c , ' ! { ^ ( L W 0 f l p w E H P R Z Z ` ..+.@.@.#. .$.@.@.+...` Z Z R P H E w p l f %.W < ( ^ { ! ' , c - } ",
|
||||||
|
" . * 2 V > 4 ) ~ { ^ L W 6 9 X k m v y F I P Q Y Z Z ` ` S .` ` ` Z Z Y Q P I F y v m k X 9 L W ( ^ { ~ ) 4 > V 2 } ",
|
||||||
|
" . 1 M N ; a h q ~ { B u < O 8 e f m v w y F H I P Q R R S T U R R Q P I H F y w v m f e 8 O L u ^ { ~ q h a ; N M } ",
|
||||||
|
" . s C = - ; a ' q ~ t u ( < [ 7 e f k m v D x E F G H I J K I I H G F E x D v m k f e 7 [ < L u { ~ q ' a ; - = C } ",
|
||||||
|
" . r s * = - c a ' q t u ^ / : [ 6 8 e f k m n v v w x y z A y y x w v v n m k f e 8 6 [ : / B u ~ q ' a c - = * s } ",
|
||||||
|
" . b i & * 2 - c a ' @+#+{ j ^ _ < [ 7 9 e f f k l m m n z |.p n m m l k f f e 9 7 [ < _ ^ j t #+q ' a c - 2 * & i } ",
|
||||||
|
" . | b % & * 2 - c a d ) ! ~ ] ^ / : < [ 6 7 0 e e f f f e f f f f f e e 0 7 6 [ < : / ^ ] ~ g ) h a c - 2 * & % b } ",
|
||||||
|
" . @ | $ % 1 * 2 - ; 3 4 ' ! ~ { ] ^ / _ < 5 [ 6 7 7 8 9 7 0 0 9 8 7 7 6 [ 5 < _ / ^ ] { ~ ! , 4 a ; - 2 * 1 % $ | } ",
|
||||||
|
" . + @ # $ % & * = - $+> , ' ) ! ~ { ] ^ / ( _ : < < [ [ %+[ [ [ [ < < : _ ( / ^ ] { ~ ! ) ' a > ; - = * & % $ # @ } ",
|
||||||
|
" . &++ @ # $ % & * = N V c a 4 ' q ! ~ e.] j ^ ^ / ( ( _ _ _ _ _ ( ( / ^ ^ j ] e.~ ! q ' 4 a c V N = * & % $ # @ + } ",
|
||||||
|
" . } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } ",
|
||||||
|
" *+ *+ *+ *+ *+ *+*+*+ *+*+*+ ",
|
||||||
|
" *+*+ *+*+ *+ *+ *+ *+ *+ *+ *+*+*+*+ ",
|
||||||
|
" *+ *+ *+ *+ *+*+ *+*+*+ *+*+*+ *+=+=+=+ ",
|
||||||
|
" *+ *+ *+ *+ *+ *+ *+ *+ *+=+=+=+ ",
|
||||||
|
" *+ *+ *+ *+ *+ *+*+*+ *+ *+ ",
|
||||||
|
" ",
|
||||||
|
" "};
|
30
AlsaMixer.app/skins/default/mutebutton.xpm
Normal file
30
AlsaMixer.app/skins/default/mutebutton.xpm
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * mutebutton_xpm[] = {
|
||||||
|
"16 9 18 1",
|
||||||
|
" c None",
|
||||||
|
". c #B7BAC7",
|
||||||
|
"+ c #848694",
|
||||||
|
"@ c #838593",
|
||||||
|
"# c #828392",
|
||||||
|
"$ c #808290",
|
||||||
|
"% c #7F818F",
|
||||||
|
"& c #7E808E",
|
||||||
|
"* c #7C7E8C",
|
||||||
|
"= c #7B7D8B",
|
||||||
|
"- c #7A7C8A",
|
||||||
|
"; c #787A88",
|
||||||
|
"> c #777987",
|
||||||
|
", c #767886",
|
||||||
|
"' c #747784",
|
||||||
|
") c #737583",
|
||||||
|
"! c #000000",
|
||||||
|
"~ c #FF0000",
|
||||||
|
"................",
|
||||||
|
".+@#$%&*=-;>,')!",
|
||||||
|
".!!!!!!!!!!!!!!!",
|
||||||
|
"...............!",
|
||||||
|
".+@#$%&*=-;>,')!",
|
||||||
|
".!!!!!!!!!!!!!!!",
|
||||||
|
"...........!~~~!",
|
||||||
|
".+@#$%&*=-;!~~~!",
|
||||||
|
".!!!!!!!!!!!!!!!"};
|
7
AlsaMixer.app/skins/default/redlight.xpm
Normal file
7
AlsaMixer.app/skins/default/redlight.xpm
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/* XPM */
|
||||||
|
static char * redlight_xpm[] = {
|
||||||
|
"3 2 2 1",
|
||||||
|
" c None",
|
||||||
|
". c #FF0000",
|
||||||
|
"...",
|
||||||
|
"..."};
|
Loading…
Reference in a new issue