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:
parent
ac5b743dd2
commit
0ce83abbfb
@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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];
|
||||
|
||||
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user