|
|
|
/*
|
|
|
|
* KMix -- KDE's full featured mini mixer
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Copyright (C) 1996-2000 Christian Esken
|
|
|
|
* esken@kde.org
|
|
|
|
*
|
|
|
|
* HP/UX-Port: Copyright (C) 1999 by Helge Deller
|
|
|
|
* deller@gmx.de
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library 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
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this program; if not, write to the Free
|
|
|
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "mixer_hpux.h"
|
|
|
|
|
|
|
|
#warning "HP/UX mixer (maybe) doesn't work yet !"
|
|
|
|
|
|
|
|
#define HPUX_ERROR_OFFSET 1024
|
|
|
|
|
|
|
|
#define myGain AUnityGain /* AUnityGain or AZeroGain */
|
|
|
|
|
|
|
|
#define GAIN_OUT_DIFF ((long) ((int)aMaxOutputGain(audio) - (int)aMinOutputGain(audio)))
|
|
|
|
#define GAIN_OUT_MIN ((long) aMinOutputGain(audio))
|
|
|
|
#define GAIN_IN_DIFF ((long) ((int)aMaxInputGain(audio) - (int)aMinInputGain(audio)))
|
|
|
|
#define GAIN_IN_MIN ((long) aMinOutputGain(audio))
|
|
|
|
|
|
|
|
/* standard */
|
|
|
|
#define ID_PCM 4
|
|
|
|
|
|
|
|
/* AInputSrcType: */ /*OSS:*/
|
|
|
|
#define ID_IN_MICROPHONE 7 /* AISTMonoMicrophone */
|
|
|
|
#define ID_IN_AUX 6 /* AISTLeftAuxiliary, AISTRightAuxiliary */
|
|
|
|
|
|
|
|
/* AOutputDstType: */
|
|
|
|
#define ID_OUT_INT_SPEAKER 0 /* AODTMonoIntSpeaker */
|
|
|
|
|
|
|
|
/* not yet implemented:
|
|
|
|
AODTLeftJack, AODTRightJack,
|
|
|
|
AODTLeftLineOut, AODTRightLineOut,
|
|
|
|
AODTLeftHeadphone, AODTRightHeadphone
|
|
|
|
|
|
|
|
const char* MixerDevNames[32]={"Volume" , "Bass" , "Treble" , "Synth" , "Pcm" , \
|
|
|
|
"Speaker" , "Line" , "Microphone", "CD" , "Mix" , \
|
|
|
|
"Pcm2" , "RecMon" , "IGain" , "OGain" , "Line1", \
|
|
|
|
"Line2" , "Line3" , "Digital1" , "Digital2", "Digital3", \
|
|
|
|
"PhoneIn" , "PhoneOut", "Video" , "Radio" , "Monitor", \
|
|
|
|
"3D-depth", "3D-center", "unknown" , "unknown" , "unknown", \
|
|
|
|
"unknown" , "unused" };
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Mixer_HPUX::Mixer_HPUX(int devnum) : Mixer_Backend(devnum)
|
|
|
|
{
|
|
|
|
char ServerName[10];
|
|
|
|
ServerName[0] = 0;
|
|
|
|
audio = AOpenAudio(ServerName,NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
Mixer_HPUX::~Mixer_HPUX()
|
|
|
|
{
|
|
|
|
if (audio) {
|
|
|
|
ACloseAudio(audio,0);
|
|
|
|
audio = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int Mixer_HPUX::open()
|
|
|
|
{
|
|
|
|
if (audio==0) {
|
|
|
|
return Mixer::ERR_OPEN;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Mixer is open. Now define properties */
|
|
|
|
stereodevs = devmask = (1<<ID_PCM); /* activate pcm */
|
|
|
|
recmask = 0;
|
|
|
|
|
|
|
|
/* check Input devices... */
|
|
|
|
if (AInputSources(audio) & AMonoMicrophoneMask) {
|
|
|
|
devmask |= (1<<ID_IN_MICROPHONE);
|
|
|
|
recmask |= (1<<ID_IN_MICROPHONE);
|
|
|
|
}
|
|
|
|
if (AInputSources(audio) & (ALeftAuxiliaryMask|ARightAuxiliaryMask)) {
|
|
|
|
devmask |= (1<<ID_IN_AUX);
|
|
|
|
recmask |= (1<<ID_IN_AUX);
|
|
|
|
stereodevs |= (1<<ID_IN_AUX);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* check Output devices... */
|
|
|
|
if (AOutputDestinations(audio) & AMonoIntSpeakerMask) {
|
|
|
|
devmask |= (1<<ID_OUT_INT_SPEAKER);
|
|
|
|
stereodevs |= (1<<ID_OUT_INT_SPEAKER);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* implement later:
|
|
|
|
----------------
|
|
|
|
if (AOutputDestinations(audio) & AMonoLineOutMask) devmask |= 64; // Line
|
|
|
|
if (AOutputDestinations(audio) & AMonoJackMask) devmask |= (1<<14); // Line1
|
|
|
|
if (AOutputDestinations(audio) & AMonoHeadphoneMask) devmask |= (1<<15); // Line2
|
|
|
|
*/
|
|
|
|
|
|
|
|
MaxVolume = 255;
|
|
|
|
|
|
|
|
long error = 0;
|
|
|
|
ASetSystemPlayGain(audio, myGain, &error);
|
|
|
|
if (error) errorText(error + HPUX_ERROR_OFFSET);
|
|
|
|
ASetSystemRecordGain(audio, myGain, &error);
|
|
|
|
if (error) errorText(error + HPUX_ERROR_OFFSET);
|
|
|
|
|
|
|
|
i_recsrc = 0;
|
|
|
|
m_isOpen = true;
|
|
|
|
|
|
|
|
m_mixerName = "HP Mixer"; /* AAudioString(audio); */
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int Mixer_HPUX::close()
|
|
|
|
{
|
|
|
|
m_isOpen = false;
|
|
|
|
m_mixDevices.clear();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
void Mixer_HPUX::setDevNumName_I(int devnum)
|
|
|
|
{
|
|
|
|
devname = "HP Mixer";
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
bool Mixer_HPUX::setRecsrcHW( int devnum, bool on )
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Mixer_HPUX::isRecsrcHW( int devnum )
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Mixer_HPUX::readVolumeFromHW( int devnum, Volume &vol )
|
|
|
|
{
|
|
|
|
long Gain;
|
|
|
|
long error = 0;
|
|
|
|
int vl,vr;
|
|
|
|
|
|
|
|
switch (devnum) {
|
|
|
|
case ID_OUT_INT_SPEAKER: /* AODTMonoIntSpeaker */
|
|
|
|
AGetSystemChannelGain(audio, ASGTPlay, ACTMono, &Gain, &error );
|
|
|
|
vl = vr = (Gain-GAIN_OUT_MIN)*255 / GAIN_OUT_DIFF;
|
|
|
|
vol.setVolume( Volume::LEFT, vl);
|
|
|
|
vol.setVolume( Volume::RIGHT, vr);
|
|
|
|
printf("READ - Devnum: %d, Left: %d, Right: %d\n", devnum, vl, vr );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ID_IN_AUX: /* AISTLeftAuxiliary, AISTRightAuxiliary */
|
|
|
|
case ID_IN_MICROPHONE: /* AISTMonoMicrophone */
|
|
|
|
AGetSystemChannelGain(audio, ASGTRecord, ACTMono, &Gain, &error );
|
|
|
|
vl = vr = (Gain-GAIN_IN_MIN)*255 / GAIN_IN_DIFF;
|
|
|
|
vol.setVolume( Volume::LEFT, vl);
|
|
|
|
vol.setVolume( Volume::RIGHT, vr);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
error = Mixer::ERR_NODEV - HPUX_ERROR_OFFSET;
|
|
|
|
break;
|
|
|
|
};
|
|
|
|
|
|
|
|
return (error ? (error+HPUX_ERROR_OFFSET) : 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
ASystemGainType = ASGTPlay, ASGTRecord, ASGTMonitor
|
|
|
|
AChType = ACTMono, ACTLeft, ACTRight
|
|
|
|
*/
|
|
|
|
|
|
|
|
int Mixer_HPUX::writeVolumeToHW( int devnum, Volume& vol )
|
|
|
|
{
|
|
|
|
long Gain;
|
|
|
|
long error = 0;
|
|
|
|
int vl = vol.getVolume(Volume::LEFT);
|
|
|
|
int vr = vol.getVolume(Volume::RIGHT);
|
|
|
|
|
|
|
|
switch (devnum) {
|
|
|
|
case ID_OUT_INT_SPEAKER: /* AODTMonoIntSpeaker */
|
|
|
|
printf("WRITE - Devnum: %d, Left: %d, Right: %d\n", devnum, vl, vr);
|
|
|
|
Gain = vl; // only left Volume
|
|
|
|
Gain = (Gain*GAIN_OUT_DIFF) / 255 - GAIN_OUT_MIN;
|
|
|
|
ASetSystemChannelGain(audio, ASGTPlay, ACTMono, (AGainDB) Gain, &error );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ID_IN_MICROPHONE: /* AISTMonoMicrophone */
|
|
|
|
Gain = vl; // only left Volume
|
|
|
|
Gain = (Gain*GAIN_IN_DIFF) / 255 - GAIN_IN_MIN;
|
|
|
|
ASetSystemChannelGain(audio, ASGTRecord, ACTMono, (AGainDB) Gain, &error );
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ID_IN_AUX: /* AISTLeftAuxiliary, AISTRightAuxiliary */
|
|
|
|
Gain = (vl*GAIN_IN_DIFF) / 255 - GAIN_IN_MIN;
|
|
|
|
ASetSystemChannelGain(audio, ASGTRecord, ACTLeft, (AGainDB) Gain, &error );
|
|
|
|
Gain = (vr*GAIN_IN_DIFF) / 255 - GAIN_IN_MIN;
|
|
|
|
ASetSystemChannelGain(audio, ASGTRecord, ACTRight, (AGainDB) Gain, &error );
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
error = Mixer::ERR_NODEV - HPUX_ERROR_OFFSET;
|
|
|
|
break;
|
|
|
|
};
|
|
|
|
return (error ? (error+HPUX_ERROR_OFFSET) : 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TQString Mixer_HPUX::errorText(int mixer_error)
|
|
|
|
{
|
|
|
|
TQString l_s_errmsg;
|
|
|
|
if (mixer_error >= HPUX_ERROR_OFFSET) {
|
|
|
|
char errorstr[200];
|
|
|
|
AGetErrorText(audio, (AError) (mixer_error-HPUX_ERROR_OFFSET),
|
|
|
|
errorstr, sizeof(errorstr));
|
|
|
|
printf("kmix: %s: %s\n",mixerName().data(), errorstr);
|
|
|
|
l_s_errmsg = errorstr;
|
|
|
|
} else
|
|
|
|
switch (mixer_error)
|
|
|
|
{
|
|
|
|
case Mixer::ERR_OPEN:
|
|
|
|
// should use i18n...
|
|
|
|
l_s_errmsg = "kmix: HP-UX Alib-Mixer cannot be found.\n" \
|
|
|
|
"Please check that you have:\n" \
|
|
|
|
" 1. Installed the libAlib package and\n" \
|
|
|
|
" 2. started the Aserver program from the /opt/audio/bin directory\n";
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
l_s_errmsg = Mixer_Backend::errorText(mixer_error);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return l_s_errmsg;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString HPUX_getDriverName() {
|
|
|
|
return "HPUX";
|
|
|
|
}
|
|
|
|
|