audioIODeviceCallbackWithContext isn't being called

Hi all,
Juce newbie here. I’m trying to write a program that streams voice data from one endpoint to another over the network using juce::DatagramSocket. I’ve setup the following program, but the problem is that I see no indication of the audioIODeviceCallbackWithContext being called.
Take a look:

#include <JuceHeader.h>

class MicrophoneRecorder : public juce::AudioIODeviceCallback
{
public:
    MicrophoneRecorder()
    {
        socket.bindToPort(6666);
        socket.waitUntilReady(true, 10);
    }

    ~MicrophoneRecorder() {}

    void audioDeviceIOCallbackWithContext (const float* const* inputChannelData,
                                                   int numInputChannels,
                                                   float* const* outputChannelData,
                                                   int numOutputChannels,
                                                   int numSamples,
                                           const juce::AudioIODeviceCallbackContext& context) override
    {
            std::cout << "called audioDeviceIOCallbackWithContext here!" << std::endl;
            juce::AudioBuffer<float> audioBuffer(
                const_cast<float**>(inputChannelData), numInputChannels, numSamples);
            juce::MemoryBlock buffer(audioBuffer.getReadPointer(0),
                                     audioBuffer.getNumSamples() * sizeof(float));
            int bytesSent = socket.write(juce::String("127.0.0.1"), 6667, buffer.getData(), buffer.getSize());
        
            if (bytesSent < 0)
            {
               std::cout << "got back 0 bytes, something went wrong" << std::endl;
            }
        
    }

    void audioDeviceAboutToStart(juce::AudioIODevice* device) override
    {
        std::cout << "Audio device is about to start" << std::endl;
    }

    void audioDeviceStopped() override
    {
    }

private:
  
    juce::DatagramSocket socket;
};

class VoiceAudioStreamingApp : public juce::JUCEApplication
{
public:
    VoiceAudioStreamingApp()
    {
    }

    const juce::String getApplicationName() override
    {
        return juce::String("Voice Audio Streaming");
    }

    const juce::String getApplicationVersion() override
    {
        return juce::String("1.0.0");
    }

    void initialise(const juce::String& commandLine) override
    {
        juce::AudioDeviceManager deviceManager;
        deviceManager.initialise(2, 0, nullptr, true);
        deviceManager.addAudioCallback(&microphoneRecorder);
        std::cout << "added the callback" << std::endl;
    }

    void shutdown() override
    {
        juce::AudioDeviceManager deviceManager;
        deviceManager.removeAudioCallback(&microphoneRecorder);
        deviceManager.closeAudioDevice();
    }

    void systemRequestedQuit() override
    {
        quit();
    }

private:
    MicrophoneRecorder microphoneRecorder;
};

START_JUCE_APPLICATION(VoiceAudioStreamingApp)

The output I get looks like this:

JUCE v7.0.3
2023-02-09 13:12:46.093183-0600 DatagramSocketPlayground[17425:23463622] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x60000021a220> F8BB1C28-BAE8-11D6-9C31-00039315CD46
Audio device is about to start
added the callback

Then the program hangs. I never see the “called audioDeviceIOCallbackWithContext here!” being printed.
I know I’ve definitely set this up wrong, but I’m having trouble figuring out exactly what I’m doing (or not doing, for that matter) that’s causing this. Any assistance would be greatly appreciated!
Thanks!