Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extern/audaspace/plugins/coreaudio/CoreAudioSynchronizer.cpp')
-rw-r--r--extern/audaspace/plugins/coreaudio/CoreAudioSynchronizer.cpp127
1 files changed, 127 insertions, 0 deletions
diff --git a/extern/audaspace/plugins/coreaudio/CoreAudioSynchronizer.cpp b/extern/audaspace/plugins/coreaudio/CoreAudioSynchronizer.cpp
new file mode 100644
index 00000000000..fcfa7fde9be
--- /dev/null
+++ b/extern/audaspace/plugins/coreaudio/CoreAudioSynchronizer.cpp
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright 2009-2016 Jörg Müller
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+#include "CoreAudioSynchronizer.h"
+
+#include "CoreAudioDevice.h"
+#include "Exception.h"
+
+AUD_NAMESPACE_BEGIN
+
+CoreAudioSynchronizer::CoreAudioSynchronizer(AudioUnit& audio_unit) :
+ m_clock_ref(nullptr),
+ m_playing(false)
+{
+ OSStatus status = CAClockNew(0, &m_clock_ref);
+
+ if(status != noErr)
+ AUD_THROW(DeviceException, "Could not create a CoreAudio clock.");
+
+ CAClockTimebase timebase = kCAClockTimebase_AudioOutputUnit;
+
+ status = CAClockSetProperty(m_clock_ref, kCAClockProperty_InternalTimebase, sizeof(timebase), &timebase);
+
+ if(status != noErr)
+ {
+ CAClockDispose(m_clock_ref);
+ AUD_THROW(DeviceException, "Could not create a CoreAudio clock.");
+ }
+
+ status = CAClockSetProperty(m_clock_ref, kCAClockProperty_TimebaseSource, sizeof(audio_unit), &audio_unit);
+
+ if(status != noErr)
+ {
+ CAClockDispose(m_clock_ref);
+ AUD_THROW(DeviceException, "Could not create a CoreAudio clock.");
+ }
+
+ CAClockSyncMode sync_mode = kCAClockSyncMode_Internal;
+
+ status = CAClockSetProperty(m_clock_ref, kCAClockProperty_SyncMode, sizeof(sync_mode), &sync_mode);
+
+ if(status != noErr)
+ {
+ CAClockDispose(m_clock_ref);
+ AUD_THROW(DeviceException, "Could not create a CoreAudio clock.");
+ }
+}
+
+CoreAudioSynchronizer::~CoreAudioSynchronizer()
+{
+ CAClockDispose(m_clock_ref);
+}
+
+void CoreAudioSynchronizer::seek(std::shared_ptr<IHandle> handle, double time)
+{
+ if(m_playing)
+ CAClockStop(m_clock_ref);
+
+ CAClockTime clock_time;
+ clock_time.format = kCAClockTimeFormat_Seconds;
+ clock_time.time.seconds = time;
+ CAClockSetCurrentTime(m_clock_ref, &clock_time);
+
+ handle->seek(time);
+
+ if(m_playing)
+ CAClockStart(m_clock_ref);
+}
+
+double CoreAudioSynchronizer::getPosition(std::shared_ptr<IHandle> handle)
+{
+ CAClockTime clock_time;
+
+ OSStatus status;
+
+ if(m_playing)
+ status = CAClockGetCurrentTime(m_clock_ref, kCAClockTimeFormat_Seconds, &clock_time);
+ else
+ status = CAClockGetStartTime(m_clock_ref, kCAClockTimeFormat_Seconds, &clock_time);
+
+ if(status != noErr)
+ return 0;
+
+ return clock_time.time.seconds;
+}
+
+void CoreAudioSynchronizer::play()
+{
+ if(m_playing)
+ return;
+
+ m_playing = true;
+ CAClockStart(m_clock_ref);
+}
+
+void CoreAudioSynchronizer::stop()
+{
+ if(!m_playing)
+ return;
+
+ m_playing = false;
+ CAClockStop(m_clock_ref);
+}
+
+void CoreAudioSynchronizer::setSyncCallback(ISynchronizer::syncFunction function, void* data)
+{
+}
+
+int CoreAudioSynchronizer::isPlaying()
+{
+ return m_playing;
+}
+
+AUD_NAMESPACE_END