/* ============================================================================== This file is part of the JUCE 6 technical preview. Copyright (c) 2017 - ROLI Ltd. You may use this code under the terms of the GPL v3 (see www.gnu.org/licenses). For this technical preview, this file is not subject to commercial licensing. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ namespace juce { #if ! (JUCE_LINUX || JUCE_PROJUCER_LIVE_BUILD) #if JUCE_MAC || JUCE_IOS #include "../native/juce_mac_Video.h" #elif JUCE_WINDOWS #include "../native/juce_win32_Video.h" #elif JUCE_ANDROID #include "../native/juce_android_Video.h" #endif //============================================================================== VideoComponent::VideoComponent (bool useNativeControlsIfAvailable) : pimpl (new Pimpl (*this, useNativeControlsIfAvailable)) { addAndMakeVisible (pimpl.get()); } VideoComponent::~VideoComponent() { pimpl.reset(); } Result VideoComponent::load (const File& file) { return loadInternal (file, false); } Result VideoComponent::load (const URL& url) { return loadInternal (url, false); } void VideoComponent::loadAsync (const URL& url, std::function callback) { if (callback == nullptr) { jassertfalse; return; } #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC pimpl->loadAsync (url, callback); #else auto result = loadInternal (url, true); callback (url, result); #endif } void VideoComponent::closeVideo() { pimpl->close(); // Closing on Android is async and resized() will be called internally by pimpl once // close operation finished. #if ! JUCE_ANDROID// TODO JUCE_IOS too? resized(); #endif } bool VideoComponent::isVideoOpen() const { return pimpl->isOpen(); } File VideoComponent::getCurrentVideoFile() const { return pimpl->currentFile; } URL VideoComponent::getCurrentVideoURL() const { return pimpl->currentURL; } double VideoComponent::getVideoDuration() const { return pimpl->getDuration(); } Rectangle VideoComponent::getVideoNativeSize() const { return pimpl->getNativeSize(); } void VideoComponent::play() { pimpl->play(); } void VideoComponent::stop() { pimpl->stop(); } bool VideoComponent::isPlaying() const { return pimpl->isPlaying(); } void VideoComponent::setPlayPosition (double newPos) { pimpl->setPosition (newPos); } double VideoComponent::getPlayPosition() const { return pimpl->getPosition(); } void VideoComponent::setPlaySpeed (double newSpeed) { pimpl->setSpeed (newSpeed); } double VideoComponent::getPlaySpeed() const { return pimpl->getSpeed(); } void VideoComponent::setAudioVolume (float newVolume) { pimpl->setVolume (newVolume); } float VideoComponent::getAudioVolume() const { return pimpl->getVolume(); } void VideoComponent::resized() { auto r = getLocalBounds(); if (isVideoOpen() && ! r.isEmpty()) { auto nativeSize = getVideoNativeSize(); if (nativeSize.isEmpty()) { // if we've just opened the file and are still waiting for it to // figure out the size, start our timer.. if (! isTimerRunning()) startTimer (50); } else { r = RectanglePlacement (RectanglePlacement::centred).appliedTo (nativeSize, r); stopTimer(); } } else { stopTimer(); } pimpl->setBounds (r); } void VideoComponent::timerCallback() { resized(); } template Result VideoComponent::loadInternal (const FileOrURL& fileOrUrl, bool loadAsync) { #if JUCE_ANDROID || JUCE_IOS ignoreUnused (fileOrUrl, loadAsync); // You need to use loadAsync on Android & iOS. jassertfalse; return Result::fail ("load() is not supported on this platform. Use loadAsync() instead."); #else auto result = pimpl->load (fileOrUrl); if (loadAsync) startTimer (50); else resized(); return result; #endif } #endif } // namespace juce