static int coreaudio_voice_ctl (coreaudioVoice* core, int cmd) { OSStatus status; switch (cmd) { case VOICE_ENABLE: /* start playback */ D("%s: %s started\n", __FUNCTION__, core->isInput ? "input" : "output"); if (!coreaudio_voice_isPlaying(core)) { status = AudioDeviceStart(core->deviceID, core->ioproc); if (status != kAudioHardwareNoError) { coreaudio_logerr (status, "Could not resume playback\n"); } } break; case VOICE_DISABLE: /* stop playback */ D("%s: %s stopped\n", __FUNCTION__, core->isInput ? "input" : "output"); if (!conf.isAtexit) { if (coreaudio_voice_isPlaying(core)) { status = AudioDeviceStop(core->deviceID, core->ioproc); if (status != kAudioHardwareNoError) { coreaudio_logerr (status, "Could not pause playback\n"); } } } break; } return 0; }
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 (!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_fini_out (HWVoiceOut *hw) { OSStatus status; int err; coreaudioVoiceOut *core = (coreaudioVoiceOut *) hw; if (!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 inline UInt32 isPlaying (AudioDeviceID outputDeviceID) { OSStatus status; UInt32 result = 0; status = coreaudio_get_isrunning(outputDeviceID, &result); if (status != kAudioHardwareNoError) { coreaudio_logerr(status, "Could not determine whether Device is playing\n"); } return result; }
static inline UInt32 isPlaying (AudioDeviceID outputDeviceID) { OSStatus status; UInt32 result = 0; UInt32 propertySize = sizeof(outputDeviceID); status = AudioDeviceGetProperty( outputDeviceID, 0, 0, kAudioDevicePropertyDeviceIsRunning, &propertySize, &result); if (status != kAudioHardwareNoError) { coreaudio_logerr(status, "Could not determine whether Device is playing\n"); } return result; }
static inline UInt32 coreaudio_voice_isPlaying (coreaudioVoice *core) { OSStatus status; UInt32 result = 0; UInt32 propertySize = sizeof(core->deviceID); status = AudioDeviceGetProperty( core->deviceID, 0, core->isInput, kAudioDevicePropertyDeviceIsRunning, &propertySize, &result); if (status != kAudioHardwareNoError) { coreaudio_logerr(status, "Could not determine whether Device is playing\n"); } return result; }
static void coreaudio_voice_fini (coreaudioVoice* core) { OSStatus status; int err; if (!conf.isAtexit) { /* stop playback */ coreaudio_voice_ctl(core, VOICE_DISABLE); /* remove callback */ status = AudioDeviceRemoveIOProc(core->deviceID, core->ioproc); if (status != kAudioHardwareNoError) { coreaudio_logerr (status, "Could not remove IOProc\n"); } } core->deviceID = kAudioDeviceUnknown; /* destroy mutex */ err = pthread_mutex_destroy(&core->mutex); if (err) { dolog("Could not destroy mutex\nReason: %s\n", strerror (err)); } }