1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-23 07:40:05 +02:00

Bug 1940 - Clicky play when adjusting Pan or Volume TCP controls

This commit is contained in:
James Crook 2018-08-24 22:19:49 +01:00
parent ac5b743dd2
commit 0ce83abbfb
6 changed files with 42 additions and 11 deletions

View File

@ -5025,7 +5025,7 @@ int AudioIO::AudioCallback(const void *inputBuffer, void *outputBuffer,
numSolo++;
#endif
const WaveTrack **chans = (const WaveTrack **) alloca(numPlaybackChannels * sizeof(WaveTrack *));
WaveTrack **chans = (WaveTrack **) alloca(numPlaybackChannels * sizeof(WaveTrack *));
float **tempBufs = (float **) alloca(numPlaybackChannels * sizeof(float *));
for (unsigned int c = 0; c < numPlaybackChannels; c++)
{
@ -5041,7 +5041,7 @@ int AudioIO::AudioCallback(const void *inputBuffer, void *outputBuffer,
decltype(framesPerBuffer) maxLen = 0;
for (unsigned t = 0; t < numPlaybackTracks; t++)
{
const WaveTrack *vt = mPlaybackTracks[t].get();
WaveTrack *vt = mPlaybackTracks[t].get();
chans[chanCnt] = vt;
@ -5140,7 +5140,7 @@ int AudioIO::AudioCallback(const void *inputBuffer, void *outputBuffer,
if (cut) // no samples to process, they've been discarded
continue;
for (int c = 0; c < chanCnt; c++)
if (len > 0) for (int c = 0; c < chanCnt; c++)
{
vt = chans[c];
@ -5159,8 +5159,14 @@ int AudioIO::AudioCallback(const void *inputBuffer, void *outputBuffer,
if (mEmulateMixerOutputVol)
gain *= mMixerOutputVol;
for(decltype(len) i = 0; i < len; i++)
outputFloats[numPlaybackChannels*i] += gain*tempBufs[c][i];
float oldGain = vt->GetOldChannelGain(0);
if( gain != oldGain )
vt->SetOldChannelGain(0, gain);
wxASSERT(len > 0);
float deltaGain = (gain - oldGain) / len;
for (decltype(len) i = 0; i < len; i++)
outputFloats[numPlaybackChannels*i] += (oldGain + deltaGain * i) *tempBufs[c][i];
}
if (vt->GetChannel() == Track::RightChannel ||
@ -5177,8 +5183,13 @@ int AudioIO::AudioCallback(const void *inputBuffer, void *outputBuffer,
if (mEmulateMixerOutputVol)
gain *= mMixerOutputVol;
float oldGain = vt->GetOldChannelGain(1);
if (gain != oldGain)
vt->SetOldChannelGain(1,gain);
wxASSERT(len > 0);
float deltaGain = (gain - oldGain) / len;
for(decltype(len) i = 0; i < len; i++)
outputFloats[numPlaybackChannels*i+1] += gain*tempBufs[c][i];
outputFloats[numPlaybackChannels*i+1] += (oldGain + deltaGain*i) *tempBufs[c][i];
}
}

View File

@ -156,7 +156,7 @@ struct AudioIOStartStreamOptions
};
struct TransportTracks {
WaveTrackConstArray playbackTracks;
WaveTrackArray playbackTracks;
WaveTrackArray captureTracks;
#ifdef EXPERIMENTAL_MIDI_OUT
NoteTrackConstArray midiTracks;
@ -691,7 +691,7 @@ private:
ArrayOf<std::unique_ptr<RingBuffer>> mCaptureBuffers;
WaveTrackArray mCaptureTracks;
ArrayOf<std::unique_ptr<RingBuffer>> mPlaybackBuffers;
WaveTrackConstArray mPlaybackTracks;
WaveTrackArray mPlaybackTracks;
ArrayOf<std::unique_ptr<Mixer>> mPlaybackMixers;
volatile int mStreamToken;

View File

@ -1576,10 +1576,10 @@ bool TrackList::HasPendingTracks() const
}
#include "AudioIO.h"
TransportTracks GetAllPlaybackTracks(const TrackList &trackList, bool selectedOnly, bool useMidi)
TransportTracks GetAllPlaybackTracks(TrackList &trackList, bool selectedOnly, bool useMidi)
{
TransportTracks result;
result.playbackTracks = trackList.GetWaveTrackConstArray(selectedOnly);
result.playbackTracks = trackList.GetWaveTrackArray(selectedOnly);
#ifdef EXPERIMENTAL_MIDI_OUT
if (useMidi)
result.midiTracks = trackList.GetNoteTrackConstArray(selectedOnly);

View File

@ -893,6 +893,6 @@ class AUDACITY_DLL_API TrackFactory
// global functions
struct TransportTracks;
TransportTracks GetAllPlaybackTracks(const TrackList &trackList, bool selectedOnly, bool useMidi = false);
TransportTracks GetAllPlaybackTracks(TrackList &trackList, bool selectedOnly, bool useMidi = false);
#endif

View File

@ -153,6 +153,8 @@ void WaveTrack::Init(const WaveTrack &orig)
mRate = orig.mRate;
mGain = orig.mGain;
mPan = orig.mPan;
mOldGain[0] = 0.0;
mOldGain[1] = 0.0;
SetDefaultName(orig.GetDefaultName());
SetName(orig.GetName());
mDisplay = orig.mDisplay;
@ -453,6 +455,18 @@ float WaveTrack::GetChannelGain(int channel) const
return right*mGain;
}
float WaveTrack::GetOldChannelGain(int channel) const
{
return mOldGain[channel%2];
}
void WaveTrack::SetOldChannelGain(int channel, float gain)
{
mOldGain[channel % 2] = gain;
}
void WaveTrack::DoSetMinimized(bool isMinimized){
#ifdef EXPERIMENTAL_HALF_WAVE

View File

@ -138,6 +138,11 @@ private:
// Takes gain and pan into account
float GetChannelGain(int channel) const;
// Old gain is used in playback in linearly interpolating
// the gain.
float GetOldChannelGain(int channel) const;
void SetOldChannelGain(int channel, float gain);
void DoSetMinimized(bool isMinimized) override;
int GetWaveColorIndex() const { return mWaveColorIndex; };
@ -615,6 +620,7 @@ private:
float mGain;
float mPan;
int mWaveColorIndex;
float mOldGain[2];
//