⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coreaudio.c

📁 xen虚拟机源代码安装包
💻 C
📖 第 1 页 / 共 2 页
字号:
    core->decr += frameCount;    core->rpos = rpos;    coreaudio_unlock (core, "audioDeviceIOProc");    return 0;}static int coreaudio_write (SWVoiceOut *sw, void *buf, int len){    return audio_pcm_sw_write (sw, buf, len);}static int coreaudio_init_out (HWVoiceOut *hw, audsettings_t *as){    OSStatus status;    coreaudioVoiceOut *core = (coreaudioVoiceOut *) hw;    UInt32 propertySize;    int err;    int bits = 8;    const char *typ = "playback";    AudioValueRange frameRange;    /* create mutex */    err = pthread_mutex_init(&core->mutex, NULL);    if (err) {        dolog("Could not create mutex\nReason: %s\n", strerror (err));        return -1;    }    if (as->fmt == AUD_FMT_S16 || as->fmt == AUD_FMT_U16) {        bits = 16;    }    audio_pcm_init_info (&hw->info, as);    /* open default output device */    propertySize = sizeof(core->outputDeviceID);    status = AudioHardwareGetProperty(        kAudioHardwarePropertyDefaultOutputDevice,        &propertySize,        &core->outputDeviceID);    if (status != kAudioHardwareNoError) {        coreaudio_logerr2 (status, typ,                           "Could not get default output Device\n");        return -1;    }    if (core->outputDeviceID == kAudioDeviceUnknown) {        dolog ("Could not initialize %s - Unknown Audiodevice\n", typ);        return -1;    }    /* get minimum and maximum buffer frame sizes */    propertySize = sizeof(frameRange);    status = AudioDeviceGetProperty(        core->outputDeviceID,        0,        0,        kAudioDevicePropertyBufferFrameSizeRange,        &propertySize,        &frameRange);    if (status != kAudioHardwareNoError) {        coreaudio_logerr2 (status, typ,                           "Could not get device buffer frame range\n");        return -1;    }    if (frameRange.mMinimum > conf.buffer_frames) {        core->audioDevicePropertyBufferFrameSize = (UInt32) frameRange.mMinimum;        dolog ("warning: Upsizing Buffer Frames to %f\n", frameRange.mMinimum);    }    else if (frameRange.mMaximum < conf.buffer_frames) {        core->audioDevicePropertyBufferFrameSize = (UInt32) frameRange.mMaximum;        dolog ("warning: Downsizing Buffer Frames to %f\n", frameRange.mMaximum);    }    else {        core->audioDevicePropertyBufferFrameSize = conf.buffer_frames;    }    /* set Buffer Frame Size */    propertySize = sizeof(core->audioDevicePropertyBufferFrameSize);    status = AudioDeviceSetProperty(        core->outputDeviceID,        NULL,        0,        false,        kAudioDevicePropertyBufferFrameSize,        propertySize,        &core->audioDevicePropertyBufferFrameSize);    if (status != kAudioHardwareNoError) {        coreaudio_logerr2 (status, typ,                           "Could not set device buffer frame size %ld\n",                           core->audioDevicePropertyBufferFrameSize);        return -1;    }    /* get Buffer Frame Size */    propertySize = sizeof(core->audioDevicePropertyBufferFrameSize);    status = AudioDeviceGetProperty(        core->outputDeviceID,        0,        false,        kAudioDevicePropertyBufferFrameSize,        &propertySize,        &core->audioDevicePropertyBufferFrameSize);    if (status != kAudioHardwareNoError) {        coreaudio_logerr2 (status, typ,                           "Could not get device buffer frame size\n");        return -1;    }    hw->samples = conf.nbuffers * core->audioDevicePropertyBufferFrameSize;    /* get StreamFormat */    propertySize = sizeof(core->outputStreamBasicDescription);    status = AudioDeviceGetProperty(        core->outputDeviceID,        0,        false,        kAudioDevicePropertyStreamFormat,        &propertySize,        &core->outputStreamBasicDescription);    if (status != kAudioHardwareNoError) {        coreaudio_logerr2 (status, typ,                           "Could not get Device Stream properties\n");        core->outputDeviceID = kAudioDeviceUnknown;        return -1;    }    /* set Samplerate */    core->outputStreamBasicDescription.mSampleRate = (Float64) as->freq;    propertySize = sizeof(core->outputStreamBasicDescription);    status = AudioDeviceSetProperty(        core->outputDeviceID,        0,        0,        0,        kAudioDevicePropertyStreamFormat,        propertySize,        &core->outputStreamBasicDescription);    if (status != kAudioHardwareNoError) {        coreaudio_logerr2 (status, typ, "Could not set samplerate %d\n",                           as->freq);        core->outputDeviceID = kAudioDeviceUnknown;        return -1;    }    /* set Callback */    status = AudioDeviceAddIOProc(core->outputDeviceID, audioDeviceIOProc, hw);    if (status != kAudioHardwareNoError) {        coreaudio_logerr2 (status, typ, "Could not set IOProc\n");        core->outputDeviceID = kAudioDeviceUnknown;        return -1;    }    /* start Playback */    if (!isPlaying(core->outputDeviceID)) {        status = AudioDeviceStart(core->outputDeviceID, audioDeviceIOProc);        if (status != kAudioHardwareNoError) {            coreaudio_logerr2 (status, typ, "Could not start playback\n");            AudioDeviceRemoveIOProc(core->outputDeviceID, audioDeviceIOProc);            core->outputDeviceID = kAudioDeviceUnknown;            return -1;        }    }    return 0;}static void coreaudio_fini_out (HWVoiceOut *hw){    OSStatus status;    int err;    coreaudioVoiceOut *core = (coreaudioVoiceOut *) hw;    if (!conf.isAtexit) {        /* stop playback */        if (isPlaying(core->outputDeviceID)) {            status = AudioDeviceStop(core->outputDeviceID, audioDeviceIOProc);            if (status != kAudioHardwareNoError) {                coreaudio_logerr (status, "Could not stop playback\n");            }        }        /* remove callback */        status = AudioDeviceRemoveIOProc(core->outputDeviceID,                                         audioDeviceIOProc);        if (status != kAudioHardwareNoError) {            coreaudio_logerr (status, "Could not remove IOProc\n");        }    }    core->outputDeviceID = kAudioDeviceUnknown;    /* destroy mutex */    err = pthread_mutex_destroy(&core->mutex);    if (err) {        dolog("Could not destroy mutex\nReason: %s\n", strerror (err));    }}static int coreaudio_ctl_out (HWVoiceOut *hw, int cmd, ...){    OSStatus status;    coreaudioVoiceOut *core = (coreaudioVoiceOut *) hw;    switch (cmd) {    case VOICE_ENABLE:        /* start playback */        if (!isPlaying(core->outputDeviceID)) {            status = AudioDeviceStart(core->outputDeviceID, audioDeviceIOProc);            if (status != kAudioHardwareNoError) {                coreaudio_logerr (status, "Could not resume playback\n");            }        }        break;    case VOICE_DISABLE:        /* stop playback */        if (!conf.isAtexit) {            if (isPlaying(core->outputDeviceID)) {                status = AudioDeviceStop(core->outputDeviceID, audioDeviceIOProc);                if (status != kAudioHardwareNoError) {                    coreaudio_logerr (status, "Could not pause playback\n");                }            }        }        break;    }    return 0;}static void *coreaudio_audio_init (void){    atexit(coreaudio_atexit);    return &coreaudio_audio_init;}static void coreaudio_audio_fini (void *opaque){    (void) opaque;}static struct audio_option coreaudio_options[] = {    {"BUFFER_SIZE", AUD_OPT_INT, &conf.buffer_frames,     "Size of the buffer in frames", NULL, 0},    {"BUFFER_COUNT", AUD_OPT_INT, &conf.nbuffers,     "Number of buffers", NULL, 0},    {NULL, 0, NULL, NULL, NULL, 0}};static struct audio_pcm_ops coreaudio_pcm_ops = {    coreaudio_init_out,    coreaudio_fini_out,    coreaudio_run_out,    coreaudio_write,    coreaudio_ctl_out,    NULL,    NULL,    NULL,    NULL,    NULL};struct audio_driver coreaudio_audio_driver = {    INIT_FIELD (name           = ) "coreaudio",    INIT_FIELD (descr          = )    "CoreAudio http://developer.apple.com/audio/coreaudio.html",    INIT_FIELD (options        = ) coreaudio_options,    INIT_FIELD (init           = ) coreaudio_audio_init,    INIT_FIELD (fini           = ) coreaudio_audio_fini,    INIT_FIELD (pcm_ops        = ) &coreaudio_pcm_ops,    INIT_FIELD (can_be_default = ) 1,    INIT_FIELD (max_voices_out = ) 1,    INIT_FIELD (max_voices_in  = ) 0,    INIT_FIELD (voice_size_out = ) sizeof (coreaudioVoiceOut),    INIT_FIELD (voice_size_in  = ) 0};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -