Removed gain controls from input channel mapping group.

Gain for each virtual mixer channel is now controlled in the main control group.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3820 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper 2003-07-03 22:38:21 +00:00
parent 9c3be6a557
commit 69517c1537
3 changed files with 70 additions and 46 deletions

View File

@ -854,7 +854,7 @@ AudioMixer::CreateBufferGroup()
#define PARAM_SRC_ENABLE(id, chan, src) (((id) << 16) | ((chan) << 10) | ((src) << 4) | 0x1)
#define PARAM_SRC_GAIN(id, chan, src) (((id) << 16) | ((chan) << 10) | ((src) << 4) | 0x2)
#define PARAM_DST_ENABLE(id, chan, dst) (((id) << 16) | ((chan) << 10) | ((dst) << 4) | 0x3)
#define PARAM_DST_GAIN(id, chan, dst) (((id) << 16) | ((chan) << 10) | ((dst) << 4) | 0x4)
#define PARAM_SRC_STR(id, chan) (((id) << 16) | ((chan) << 10) | 0x5)
#define PARAM_DST_STR(id, chan) (((id) << 16) | ((chan) << 10) | 0x6)
#define PARAM_MUTE(id) (((id) << 16) | 0x7)
@ -874,7 +874,6 @@ AudioMixer::CreateBufferGroup()
#define PARAM_IS_SRC_ENABLE(id) (((id) & 0xf) == 0x1)
#define PARAM_IS_SRC_GAIN(id) (((id) & 0xf) == 0x2)
#define PARAM_IS_DST_ENABLE(id) (((id) & 0xf) == 0x3)
#define PARAM_IS_DST_GAIN(id) (((id) & 0xf) == 0x4)
#define PARAM_IS_MUTE(id) (((id) & 0xf) == 0x7)
#define PARAM_IS_GAIN(id) (((id) & 0xf) == 0x8)
@ -922,7 +921,7 @@ AudioMixer::GetParameterValue(int32 id, bigtime_t *last_change,
for (int i = 0; (input = fCore->Input(i)); i++)
if (input->ID() == param)
break;
if (!input || (!PARAM_IS_MUTE(id) && !PARAM_IS_GAIN(id) && !PARAM_IS_DST_ENABLE(id) && !PARAM_IS_DST_GAIN(id)))
if (!input || (!PARAM_IS_MUTE(id) && !PARAM_IS_GAIN(id) && !PARAM_IS_DST_ENABLE(id)))
goto err;
if (PARAM_IS_MUTE(id)) {
// input mute control
@ -933,11 +932,11 @@ AudioMixer::GetParameterValue(int32 id, bigtime_t *last_change,
}
if (PARAM_IS_GAIN(id)) {
// input gain control
if (*ioSize < input->GetInputChannelCount() * sizeof(float))
if (*ioSize < input->GetMixerChannelCount() * sizeof(float))
goto err;
*ioSize = input->GetInputChannelCount() * sizeof(float);
for (int chan = 0; chan < input->GetInputChannelCount(); chan++)
static_cast<float *>(value)[chan] = DB_TO_GAIN(input->GetInputChannelGain(chan));
*ioSize = input->GetMixerChannelCount() * sizeof(float);
for (int chan = 0; chan < input->GetMixerChannelCount(); chan++)
static_cast<float *>(value)[chan] = DB_TO_GAIN(input->GetMixerChannelGain(chan));
}
if (PARAM_IS_DST_ENABLE(id)) {
if (*ioSize < sizeof(int32))
@ -945,12 +944,6 @@ AudioMixer::GetParameterValue(int32 id, bigtime_t *last_change,
*ioSize = sizeof(int32);
static_cast<int32 *>(value)[0] = input->HasInputChannelDestination(PARAM_CHAN(id), PARAM_DST(id));
}
if (PARAM_IS_DST_GAIN(id)) {
if (*ioSize < sizeof(float))
goto err;
*ioSize = sizeof(float);
static_cast<float *>(value)[0] = GAIN_TO_PERCENT(input->GetInputChannelDestinationGain(PARAM_CHAN(id), PARAM_DST(id)));
}
}
*last_change = TimeSource()->Now(); // XXX we could do better
fCore->Unlock();
@ -965,6 +958,7 @@ AudioMixer::SetParameterValue(int32 id, bigtime_t when,
const void *value, size_t size)
{
TRACE("SetParameterValue: id 0x%08x, size %ld\n", id, size);
bool update = false;
int param = PARAM(id);
fCore->Lock();
if (param == 0) {
@ -1003,7 +997,7 @@ AudioMixer::SetParameterValue(int32 id, bigtime_t when,
for (int i = 0; (input = fCore->Input(i)); i++)
if (input->ID() == param)
break;
if (!input || (!PARAM_IS_MUTE(id) && !PARAM_IS_GAIN(id) && !PARAM_IS_DST_ENABLE(id) && !PARAM_IS_DST_GAIN(id)))
if (!input || (!PARAM_IS_MUTE(id) && !PARAM_IS_GAIN(id) && !PARAM_IS_DST_ENABLE(id)))
goto err;
if (PARAM_IS_MUTE(id)) {
// input mute control
@ -1013,10 +1007,10 @@ AudioMixer::SetParameterValue(int32 id, bigtime_t when,
}
if (PARAM_IS_GAIN(id)) {
// input gain control
if (size < input->GetInputChannelCount() * sizeof(float))
if (size < input->GetMixerChannelCount() * sizeof(float))
goto err;
for (int chan = 0; chan < input->GetInputChannelCount(); chan++)
input->SetInputChannelGain(chan, GAIN_TO_DB(static_cast<const float *>(value)[chan]));
for (int chan = 0; chan < input->GetMixerChannelCount(); chan++)
input->SetMixerChannelGain(chan, GAIN_TO_DB(static_cast<const float *>(value)[chan]));
}
if (PARAM_IS_DST_ENABLE(id)) {
if (size != sizeof(int32))
@ -1032,24 +1026,21 @@ AudioMixer::SetParameterValue(int32 id, bigtime_t when,
} else {
input->RemoveInputChannelDestination(PARAM_CHAN(id), PARAM_DST(id));
}
}
if (PARAM_IS_DST_GAIN(id)) {
if (size != sizeof(float))
goto err;
input->SetInputChannelDestinationGain(PARAM_CHAN(id), PARAM_DST(id), PERCENT_TO_GAIN(static_cast<const float *>(value)[0]));
// We have an ugly display where each destination gain slider
// is diplayed for each input channel.
// Update all other sliders for this destination type
for (int chan = 0; chan < input->GetInputChannelCount(); chan++) {
if (PARAM_CHAN(id) == chan)
continue;
BroadcastNewParameterValue(when, PARAM_DST_GAIN(PARAM(id), chan, PARAM_DST(id)), const_cast<void *>(value), size);
}
// The slider count of the gain control needs to be changed,
// but calling SetChannelCount(input->GetMixerChannelCount())
// on it has no effect on remove parameter webs in other apps.
// BroadcastChangedParameter() should be correct, but doesn't work
BroadcastChangedParameter(PARAM_GAIN(PARAM(id)));
// We trigger a complete ParameterWeb update as workaround
// but it will change the fokus from tab 3 to tab 1
update = true;
}
}
BroadcastNewParameterValue(when, id, const_cast<void *>(value), size);
err:
fCore->Unlock();
if (update)
UpdateParameterWeb();
}
void
@ -1087,9 +1078,11 @@ AudioMixer::UpdateParameterWeb()
group = top->MakeGroup("");
group->MakeNullParameter(PARAM_STR1(in->ID()), B_MEDIA_RAW_AUDIO, in->MediaInput().name, B_WEB_BUFFER_INPUT);
group->MakeNullParameter(PARAM_STR2(in->ID()), B_MEDIA_RAW_AUDIO, StringForFormat(buf, in), B_GENERIC);
group->MakeDiscreteParameter(PARAM_MUTE(in->ID()), B_MEDIA_RAW_AUDIO, "Mute", B_MUTE);
group->MakeDiscreteParameter(PARAM_MUTE(in->ID()), B_MEDIA_RAW_AUDIO, "Mute", B_MUTE);
// XXX the gain control is ugly once you have more than two channels,
// as you don't know what channel each slider controls. Tooltips might help...
group->MakeContinuousParameter(PARAM_GAIN(in->ID()), B_MEDIA_RAW_AUDIO, "Gain", B_GAIN, "dB", -60.0, 18.0, 0.5)
->SetChannelCount(in->GetInputChannelCount());
->SetChannelCount(in->GetMixerChannelCount());
group->MakeNullParameter(PARAM_STR3(in->ID()), B_MEDIA_RAW_AUDIO, "To Master", B_WEB_BUFFER_OUTPUT);
}
@ -1119,11 +1112,9 @@ AudioMixer::UpdateParameterWeb()
top = web->MakeGroup("Input Mapping"); // top level group
inputchannels = top->MakeGroup("");
// inputchannels->MakeNullParameter(PARAM_STR7(0), B_MEDIA_RAW_AUDIO, "Input Channel Destinations", B_GENERIC);
inputchannels->MakeNullParameter(PARAM_STR7(0), B_MEDIA_RAW_AUDIO, "Input Channel Destinations (PREVIEW; DISPLAYS ONLY ONE CONNECTED INPUT)", B_GENERIC);
inputchannels->MakeNullParameter(PARAM_STR7(0), B_MEDIA_RAW_AUDIO, "Input Channel Destinations", B_GENERIC);
// for (int i = 0; (in = fCore->Input(i)); i++) {
if ((in = fCore->Input(1)) || (in = fCore->Input(0))) { // XXX limited to input 1 or 0 to aviod BSlider problems
for (int i = 0; (in = fCore->Input(i)); i++) {
group = inputchannels->MakeGroup("");
group->MakeNullParameter(PARAM_STR4(in->ID()), B_MEDIA_RAW_AUDIO, in->MediaInput().name, B_GENERIC);
group = group->MakeGroup("");
@ -1133,10 +1124,7 @@ AudioMixer::UpdateParameterWeb()
subgroup->MakeNullParameter(PARAM_DST_STR(in->ID(), chan), B_MEDIA_RAW_AUDIO,
StringForChannelType(buf, in->GetInputChannelType(chan)), B_GENERIC);
for (int dst = 0; dst < MAX_CHANNEL_TYPES; dst++) {
subsubgroup = subgroup->MakeGroup("");
subsubgroup->MakeDiscreteParameter(PARAM_DST_ENABLE(in->ID(), chan, dst), B_MEDIA_RAW_AUDIO, "", B_ENABLE);
subsubgroup->MakeContinuousParameter(PARAM_DST_GAIN(in->ID(), chan, dst), B_MEDIA_RAW_AUDIO,
StringForChannelType(buf, dst), B_GAIN, "%", 0.0, 100.0, 1.0);
subgroup->MakeDiscreteParameter(PARAM_DST_ENABLE(in->ID(), chan, dst), B_MEDIA_RAW_AUDIO, StringForChannelType(buf, dst), B_ENABLE);
}
}

View File

@ -267,6 +267,7 @@ MixerInput::GetInputChannelType(int channel)
return GetChannelType(channel, fInputChannelMask);
}
/*
void
MixerInput::SetInputChannelGain(int channel, float gain)
{
@ -287,6 +288,7 @@ MixerInput::GetInputChannelGain(int channel)
return 0.0f;
return fInputChannelInfo[channel].gain;
}
*/
void
MixerInput::UpdateInputChannelDestinationMask()
@ -396,7 +398,7 @@ MixerInput::UpdateInputChannelDestinations()
TRACE("UpdateInputChannelDestinations: leave\n");
}
/*
void
MixerInput::SetInputChannelDestinationGain(int channel, int destination_type, float gain)
{
@ -431,6 +433,35 @@ MixerInput::GetInputChannelDestinationGain(int channel, int destination_type)
return 0.0f;
return fChannelTypeGain[destination_type];
}
*/
void
MixerInput::SetMixerChannelGain(int mixer_channel, float gain)
{
if (mixer_channel < 0 || mixer_channel >= fMixerChannelCount)
return;
if (gain < 0.0f)
gain = 0.0f;
fMixerChannelInfo[mixer_channel].destination_gain = gain;
fChannelTypeGain[fMixerChannelInfo[mixer_channel].destination_type] = gain;
}
float
MixerInput::GetMixerChannelGain(int mixer_channel)
{
if (mixer_channel < 0 || mixer_channel >= fMixerChannelCount)
return 0.0;
return fMixerChannelInfo[mixer_channel].destination_gain;
}
int
MixerInput::GetMixerChannelType(int mixer_channel)
{
if (mixer_channel < 0 || mixer_channel >= fMixerChannelCount)
return -1;
return fMixerChannelInfo[mixer_channel].destination_type;
}
void
MixerInput::SetEnabled(bool yesno)

View File

@ -24,22 +24,27 @@ public:
// The physical input channels
uint32 GetInputChannelCount();
int GetInputChannelType(int channel);
void SetInputChannelGain(int channel, float gain);
float GetInputChannelGain(int channel);
// void SetInputChannelGain(int channel, float gain);
// float GetInputChannelGain(int channel);
// The destinations for each channel
void AddInputChannelDestination(int channel, int destination_type);
void RemoveInputChannelDestination(int channel, int destination_type);
void SetInputChannelDestinationGain(int channel, int destination_type, float gain);
float GetInputChannelDestinationGain(int channel, int destination_type);
// void SetInputChannelDestinationGain(int channel, int destination_type, float gain);
// float GetInputChannelDestinationGain(int channel, int destination_type);
bool HasInputChannelDestination(int channel, int destination_type);
int GetInputChannelForDestination(int destination_type); // returns -1 if not found
// The virtual mixer channels that are generated from destinations
uint32 GetMixerChannelCount();
void SetMixerChannelGain(int mixer_channel, float gain);
float GetMixerChannelGain(int mixer_channel);
int GetMixerChannelType(int mixer_channel);
void SetEnabled(bool yesno);
bool IsEnabled();
// only for use by MixerCore
uint32 GetMixerChannelCount();
bool GetMixerChannelInfo(int mixer_channel, int64 framepos, bigtime_t time, const float **buffer, uint32 *sample_offset, int *type, float *gain);
protected: