1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-09-23 15:41:09 +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++; numSolo++;
#endif #endif
const WaveTrack **chans = (const WaveTrack **) alloca(numPlaybackChannels * sizeof(WaveTrack *)); WaveTrack **chans = (WaveTrack **) alloca(numPlaybackChannels * sizeof(WaveTrack *));
float **tempBufs = (float **) alloca(numPlaybackChannels * sizeof(float *)); float **tempBufs = (float **) alloca(numPlaybackChannels * sizeof(float *));
for (unsigned int c = 0; c < numPlaybackChannels; c++) for (unsigned int c = 0; c < numPlaybackChannels; c++)
{ {
@ -5041,7 +5041,7 @@ int AudioIO::AudioCallback(const void *inputBuffer, void *outputBuffer,
decltype(framesPerBuffer) maxLen = 0; decltype(framesPerBuffer) maxLen = 0;
for (unsigned t = 0; t < numPlaybackTracks; t++) for (unsigned t = 0; t < numPlaybackTracks; t++)
{ {
const WaveTrack *vt = mPlaybackTracks[t].get(); WaveTrack *vt = mPlaybackTracks[t].get();
chans[chanCnt] = vt; 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 if (cut) // no samples to process, they've been discarded
continue; continue;
for (int c = 0; c < chanCnt; c++) if (len > 0) for (int c = 0; c < chanCnt; c++)
{ {
vt = chans[c]; vt = chans[c];
@ -5159,8 +5159,14 @@ int AudioIO::AudioCallback(const void *inputBuffer, void *outputBuffer,
if (mEmulateMixerOutputVol) if (mEmulateMixerOutputVol)
gain *= mMixerOutputVol; gain *= mMixerOutputVol;
for(decltype(len) i = 0; i < len; i++) float oldGain = vt->GetOldChannelGain(0);
outputFloats[numPlaybackChannels*i] += gain*tempBufs[c][i]; 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 || if (vt->GetChannel() == Track::RightChannel ||
@ -5177,8 +5183,13 @@ int AudioIO::AudioCallback(const void *inputBuffer, void *outputBuffer,
if (mEmulateMixerOutputVol) if (mEmulateMixerOutputVol)
gain *= mMixerOutputVol; 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++) 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 { struct TransportTracks {
WaveTrackConstArray playbackTracks; WaveTrackArray playbackTracks;
WaveTrackArray captureTracks; WaveTrackArray captureTracks;
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
NoteTrackConstArray midiTracks; NoteTrackConstArray midiTracks;
@ -691,7 +691,7 @@ private:
ArrayOf<std::unique_ptr<RingBuffer>> mCaptureBuffers; ArrayOf<std::unique_ptr<RingBuffer>> mCaptureBuffers;
WaveTrackArray mCaptureTracks; WaveTrackArray mCaptureTracks;
ArrayOf<std::unique_ptr<RingBuffer>> mPlaybackBuffers; ArrayOf<std::unique_ptr<RingBuffer>> mPlaybackBuffers;
WaveTrackConstArray mPlaybackTracks; WaveTrackArray mPlaybackTracks;
ArrayOf<std::unique_ptr<Mixer>> mPlaybackMixers; ArrayOf<std::unique_ptr<Mixer>> mPlaybackMixers;
volatile int mStreamToken; volatile int mStreamToken;

View File

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

View File

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

View File

@ -153,6 +153,8 @@ void WaveTrack::Init(const WaveTrack &orig)
mRate = orig.mRate; mRate = orig.mRate;
mGain = orig.mGain; mGain = orig.mGain;
mPan = orig.mPan; mPan = orig.mPan;
mOldGain[0] = 0.0;
mOldGain[1] = 0.0;
SetDefaultName(orig.GetDefaultName()); SetDefaultName(orig.GetDefaultName());
SetName(orig.GetName()); SetName(orig.GetName());
mDisplay = orig.mDisplay; mDisplay = orig.mDisplay;
@ -453,6 +455,18 @@ float WaveTrack::GetChannelGain(int channel) const
return right*mGain; 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){ void WaveTrack::DoSetMinimized(bool isMinimized){
#ifdef EXPERIMENTAL_HALF_WAVE #ifdef EXPERIMENTAL_HALF_WAVE

View File

@ -138,6 +138,11 @@ private:
// Takes gain and pan into account // Takes gain and pan into account
float GetChannelGain(int channel) const; 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; void DoSetMinimized(bool isMinimized) override;
int GetWaveColorIndex() const { return mWaveColorIndex; }; int GetWaveColorIndex() const { return mWaveColorIndex; };
@ -615,6 +620,7 @@ private:
float mGain; float mGain;
float mPan; float mPan;
int mWaveColorIndex; int mWaveColorIndex;
float mOldGain[2];
// //