Problem changing AudioMixer4 gain in library

Status
Not open for further replies.

radiorpl

Member
Hi,
I am attempting to make a device that plays back multiple wav files and runs them through effects.

I also want to use a seven segment display as an interface and to have a few encoders control multiple parameters. To handle all these states I am using the automaton library by tinkerspy: https://github.com/tinkerspy/Automaton

I made some proof of concept sketches to familiarize myself with the audio library, and I was able to control AudioMixer4 objects using pots with no problem.

In my current code, I am trying to split different parts of the program into different state machine libraries. One of the machines I am trying to build is a volume controller that will control either master volume (sgtl5000_1.volume()) or different instance of the wav player's volume by changing the appropriate mixer gain.

When I split things up, controlling the sgtl5000 works, but controlling mixer gain does not.
I have tried setting up and including the mixers every way that I can think of, but even when it compiles and runs, none of the commands to the mixers in Atm_master_vol.cpp have any effect.

I did something similar to the Atm_master_vol.setVolume in an earlier sketch this way, and it worked:

void SetMasterVolume(int level) {
// read the knob position for master volume(analog input A2)
float vol = (float)level / 1280.0;
sgtl5000_1.volume(vol);
//Serial.print("volume = ");
//Serial.println(vol);
}

void SetFeedbackLevel(int level) {
// uncomment for A3 knob to control the feedback level
float feedback = (float)level / 1050.0;
mixer2.gain(1, feedback);
}

however when i try to do it in the library, only the sgtl5000 volume control is working. I have sgtl5000 and the AudioMixer4 objects declared the same way in audio_system_mix.h.

//audio_system_mix.h
#pragma once
//#include "audio_system.h"
//#include <Audio.h>
//audio library
static AudioMixer4 mixer2; //xy=568,393
static AudioMixer4 mixer1; //xy=575,263
static AudioMixer4 mixer4; //xy=760,403
static AudioMixer4 mixer3; //xy=765,263
static AudioControlSGTL5000 sgtl5000_1; //xy=744,575

Can you please help me understand why i can change the sftl5000 volume and not mixer3 or mixer4 .gain?



Thank you!

Full source can be found here: https://github.com/radiorpl/Atm_bira_teensy
 
Last edited:
I'd insert a println(level) in SetFeedbackLevel to see if it ever gets called and with which values.
 
Thanks, I'll try that. I should mention that in the machine::begin of Atm_master_vol.cpp, changing values of the mixer gains also has no effect. I can comment them out or leave them and it doesn't change anything. Meanwhile, in the begin,
sgtl5000_1.volume(0.5);
works, and you can hear the gain change from this, so it seems that no calls to the mixer gain are working in the cpp file, but sgtl5000_1 calls are working.
 
Can you please help me understand why i can change the sftl5000 volume and not mixer3 or mixer4 .gain?

The problem is probably due to your use of "static".

Code:
static AudioMixer4              mixer4;         //xy=760,403
static AudioMixer4              mixer3;         //xy=765,263

This will create separate copies of the mixer objects for each file where you use them. The ones you're controlling in another file aren't the same mixers which are actually processing your audio.
 
Thanks Paul! Declaring in Atm_master_vol.cpp and changing static to extern in the audio_system_mix.h did the trick!

Also, thank you for the teensy and audio library, I'm finding lots of awesome stuff to do with them.
 
Hi I was incorrect before when I said sgtl5000_1.volume was working completely. It does work to change the volume in the begin section of Atm_master_vol.cpp, but in the function setVolume, it does not work.

The mixer gains I was originally asking about do work in this function, just not the sgtl5000_1.volume().
Can you help me under stand why I can set the sgtl5000 volume in one part of the file and not in another?

sgtl5000_1.volume(0.5) works here:
Machine::begin( state_table, ELSE );
vol_control = volCon;
AudioMemory(160);
sgtl5000_1.enable();
sgtl5000_1.volume(0.5);

but does not here:
Atm_master_vol& Atm_master_vol::setVolume( float volume ) {
if ( vol_control == 0 ){ //master
if(volume > 0.8){
volume = 0.8; //louder will clip
}
sgtl5000_1.volume(volume);
Serial.println("master vol");
Serial.println(volume);
}
else if ( vol_control == 1 ){ //wav1
mixer6.gain(0, volume);
Serial.println("bira 1 volume");
Serial.println(volume);
}
else if ( vol_control == 2 ){ //wav2
mixer6.gain(1, volume);
Serial.println("bira 2 volume");
Serial.println(volume);
}
return *this;
}

full source at:
https://github.com/radiorpl/Atm_rpl_repo

Thank you!
 
Status
Not open for further replies.
Back
Top