PortAudio real-time audio processing for continuous input stream

后端 未结 1 1221
伪装坚强ぢ
伪装坚强ぢ 2021-01-20 21:33

I am using PortAudio to implement a real-time audio processing.

My primary task is to acquire data from mic continuously and provide 100 samples for processing

1条回答
  •  醉话见心
    2021-01-20 22:23

    Example code of processing audio input:

    #define FRAME_SIZE                 1024
    #define CIRCULAR_BUFFER_SIZE       (FRAME_SIZE * 4)
    
    float buffer[CIRCULAR_BUFFER_SIZE];
    
    typedef struct {
         int read, write;
         float vol;
    } paData;
    
    static int paStreamCallback(const void* input, void* output,
                                unsigned long samplesPerFrame,
                                const PaStreamCallbackTimeInfo* timeInfo,
                                PaStreamCallbackFlags statusFlags,
                                void* userData) {
    
        paData *data = (paData *)userData;
        // Write input buffer to our buffer: (memcpy function is fine, just a for loop of writing data
        memcpy(&buffer[write], input, samplesPerFrame); // Assuming samplesPerFrame = FRAME_SIZE
    
        // Increment write/wraparound
        write = (write + FRAME_SIZE) % CIRCULAR_BUFFER_SIZE;
    
        // dummy algorithm for processing blocks:
        processAlgorithm(&buffer[read]);
    
        // Write output
        float *dummy_buffer = &buffer[read]; // just for easy increment
        for (int i = 0; i < samplesPerFrame; i++) {
             // Mix audio input and processed input; 50% mix
             output[i] = input[i] * 0.5 + dummy_buffer[i] * 0.5;
        }
    
        // Increment read/wraparound
        read = (read + FRAME_SIZE) % CIRCULAR_BUFFER_SIZE;
    
        return paContinue;
    }
    
    int main(void) {
         // Initialize code here; any memory allocation needs to be done here! default buffers to 0 (silence)
         // initialize paData too; write = 0, read = 3072
         // read is 3072 because I'm thinking about this like a delay system.
    }
    

    Take this with a grain of salt; Obviously better ways of doing this but it can be used as a starting point.

    0 讨论(0)
提交回复
热议问题