Как использовать AudioQueue для воспроизведения звука для Mac OSX на C ++

Я пытаюсь воспроизвести звук в OSX из буфера (например, эквивалент функции Windows «PlaySound»).

Я собрал код C ++ для воспроизведения звука с помощью AudioQueue (так как я понимаю, что это самый простой способ воспроизведения звука в OSX).

Однако звук никогда не генерируется, и функция обратного вызова звука никогда не называется.

Кто-нибудь знает, что я делаю не так, или у кого-нибудь есть простой пример C / C ++ того, как воспроизводить звук в OSX?


#include 
#include 

#define BUFFER_COUNT 3
static struct AQPlayerState {
    AudioStreamBasicDescription   desc;
    AudioQueueRef                 queue;
    AudioQueueBufferRef           buffers[BUFFER_COUNT];
    unsigned buffer_size;
} state;

static void audio_callback (void *aux, AudioQueueRef aq, AudioQueueBufferRef bufout)
{
    printf("I never get called!\n");
#define nsamples 4096
    short data[nsamples];
    for (int i=0;imAudioDataByteSize = nsamples * sizeof(short) * 1;

    assert(bufout->mAudioDataByteSize mAudioData, data, bufout->mAudioDataByteSize);

    AudioQueueEnqueueBuffer(state.queue, bufout, 0, NULL);
}

void audio_init()
{
    int i;

    bzero(&state, sizeof(state));

    state.desc.mFormatID = kAudioFormatLinearPCM;
    state.desc.mFormatFlags = kAudioFormatFlagIsSignedInteger   | kAudioFormatFlagIsPacked;
    state.desc.mSampleRate = 44100;
    state.desc.mChannelsPerFrame = 1;
    state.desc.mFramesPerPacket = 1;
    state.desc.mBytesPerFrame = sizeof (short) * state.desc.mChannelsPerFrame;
    state.desc.mBytesPerPacket = state.desc.mBytesPerFrame;
    state.desc.mBitsPerChannel = (state.desc.mBytesPerFrame*8)/state.desc.mChannelsPerFrame;
    state.desc.mReserved = 0;

    state.buffer_size = state.desc.mBytesPerFrame * state.desc.mSampleRate;

    if (noErr != AudioQueueNewOutput(&state.desc, audio_callback, 0, NULL, NULL, 0, &state.queue)) {
    printf("audioqueue error\n");
    return;
    }

    // Start some empty playback so we'll get the callbacks that fill in the actual audio.
    for (i = 0; i mAudioDataByteSize = state.buffer_size;
    AudioQueueEnqueueBuffer(state.queue, state.buffers[i], 0, NULL);
    }
    if (noErr != AudioQueueStart(state.queue, NULL)) printf("AudioQueueStart failed\n");
    printf("started audio\n");
}


int main() {
    audio_init();
    while (1) {
    printf("I can't hear anything!\n");
    }
}
5
задан user598524 1 February 2011 в 14:33
поделиться