Audacity 3.2.0
Classes | Macros | Functions | Variables
AudioIO.cpp File Reference
#include "AudioIO.h"
#include "AudioIOExt.h"
#include "AudioIOListener.h"
#include "float_cast.h"
#include "DeviceManager.h"
#include <cfloat>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <numeric>
#include <optional>
#include <malloc.h>
#include "portaudio.h"
#include "pa_win_wasapi.h"
#include <wx/wxcrtvararg.h>
#include <wx/log.h>
#include <wx/time.h>
#include <wx/debug.h>
#include <wx/power.h>
#include "Channel.h"
#include "Meter.h"
#include "Mix.h"
#include "Resample.h"
#include "RingBuffer.h"
#include "Decibels.h"
#include "Prefs.h"
#include "Project.h"
#include "TransactionScope.h"
#include "RealtimeEffectManager.h"
#include "QualitySettings.h"
#include "BasicUI.h"
#include "Gain.h"
Include dependency graph for AudioIO.cpp:

Go to the source code of this file.


struct  AudioIoCallback::TransportState


#define stackAllocate(T, count)   static_cast<T*>(alloca(count * sizeof(T)))


int audacityAudioCallback (const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData)
static PaSampleFormat AudacityToPortAudioSampleFormat (sampleFormat format)
static void DoSoftwarePlaythrough (constSamplePtr inputBuffer, sampleFormat inputFormat, unsigned inputChannels, float *outputBuffer, unsigned long len)
void ClampBuffer (float *pBuffer, unsigned long len)


BoolSetting SoundActivatedRecord { "/AudioIO/SoundActivatedRecord", false }

Macro Definition Documentation

◆ stackAllocate

#define stackAllocate (   T,
)    static_cast<T*>(alloca(count * sizeof(T)))

Definition at line 2051 of file AudioIO.cpp.

Function Documentation

◆ audacityAudioCallback()

int audacityAudioCallback ( const void *  inputBuffer,
void *  outputBuffer,
unsigned long  framesPerBuffer,
const PaStreamCallbackTimeInfo *  timeInfo,
PaStreamCallbackFlags  statusFlags,
void *  userData 

brief The function which is called from PortAudio's callback thread context to collect and deliver audio for / from the sound device.

This covers recording, playback, and doing both simultaneously. It is also invoked to do monitoring and software playthrough. Note that dealing with the two buffers needs some care to ensure that the right things happen for all possible cases.

inputBufferBuffer of length framesPerBuffer containing samples from the sound card, or null if not capturing audio. Note that the data type will depend on the format of audio data that was chosen when the stream was created (so could be floats or various integers)
outputBufferUninitialised buffer of length framesPerBuffer which will be sent to the sound card after the callback, or null if not playing audio back.
framesPerBufferThe length of the playback and recording buffers
PaStreamCallbackTimeInfoPointer to PortAudio time information structure, which tells us how long we have been playing / recording
statusFlagsPortAudio stream status flags
userDatapointer to user-defined data structure. Provided for flexibility by PortAudio, but not used by Audacity - the data is stored in the AudioIO class instead.

Definition at line 2522 of file AudioIO.cpp.

2527 auto gAudioIO = AudioIO::Get();
2528 return gAudioIO->AudioCallback(
2529 static_cast<constSamplePtr>(inputBuffer),
2530 static_cast<float*>(outputBuffer), framesPerBuffer,
2531 timeInfo, statusFlags, userData);
const char * constSamplePtr
Definition: SampleFormat.h:58
static AudioIO * Get()
Definition: AudioIO.cpp:126

References AudioIO::Get().

Referenced by AudioIO::StartPortAudioStream().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ AudacityToPortAudioSampleFormat()

static PaSampleFormat AudacityToPortAudioSampleFormat ( sampleFormat  format)

Definition at line 460 of file AudioIO.cpp.

462 switch(format) {
463 case int16Sample:
464 return paInt16;
465 case int24Sample:
466 return paInt24;
467 case floatSample:
468 default:
469 return paFloat32;
470 }
constexpr sampleFormat int16Sample
Definition: SampleFormat.h:43
constexpr sampleFormat floatSample
Definition: SampleFormat.h:45
constexpr sampleFormat int24Sample
Definition: SampleFormat.h:44

References floatSample, anonymous_namespace{ExportPCM.cpp}::format, int16Sample, and int24Sample.

Referenced by AudioIO::StartPortAudioStream().

Here is the caller graph for this function:

◆ ClampBuffer()

void ClampBuffer ( float *  pBuffer,
unsigned long  len 

Definition at line 2612 of file AudioIO.cpp.

2612 {
2613 for(unsigned i = 0; i < len; i++)
2614 pBuffer[i] = std::clamp(pBuffer[i], -1.0f, 1.0f);

Referenced by AudioIoCallback::FillOutputBuffers().

Here is the caller graph for this function:

◆ DoSoftwarePlaythrough()

static void DoSoftwarePlaythrough ( constSamplePtr  inputBuffer,
sampleFormat  inputFormat,
unsigned  inputChannels,
float *  outputBuffer,
unsigned long  len 

Definition at line 2503 of file AudioIO.cpp.

2509 for (unsigned int i=0; i < inputChannels; i++) {
2510 auto inputPtr = inputBuffer + (i * SAMPLE_SIZE(inputFormat));
2512 SamplesToFloats(inputPtr, inputFormat,
2513 outputBuffer + i, len, inputChannels, 2);
2514 }
2516 // One mono input channel goes to both output channels...
2517 if (inputChannels == 1)
2518 for (int i=0; i < len; i++)
2519 outputBuffer[2*i + 1] = outputBuffer[2*i];
void SamplesToFloats(constSamplePtr src, sampleFormat srcFormat, float *dst, size_t len, size_t srcStride, size_t dstStride)
Copy samples from any format into the widest format, which is 32 bit float, with no dithering.
#define SAMPLE_SIZE(SampleFormat)
Definition: SampleFormat.h:52

References SAMPLE_SIZE, and SamplesToFloats().

Referenced by AudioIoCallback::DoPlaythrough().

Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ SoundActivatedRecord

BoolSetting SoundActivatedRecord { "/AudioIO/SoundActivatedRecord", false }