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