From f5b693cebb0574486a61a26157d5e77caf96da3a Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Mon, 11 Jul 2016 12:22:27 -0700 Subject: [PATCH] added support for external hificodec and hifi codec plugin --- cmake/externals/hifiAudioCodec/CMakeLists.txt | 50 +++++++++++++ plugins/hifiCodec/CMakeLists.txt | 21 ++++++ plugins/hifiCodec/src/HiFiCodec.cpp | 72 +++++++++++++++++++ plugins/hifiCodec/src/HiFiCodec.h | 42 +++++++++++ plugins/hifiCodec/src/HiFiCodecProvider.cpp | 46 ++++++++++++ plugins/hifiCodec/src/plugin.json | 1 + 6 files changed, 232 insertions(+) create mode 100644 cmake/externals/hifiAudioCodec/CMakeLists.txt create mode 100644 plugins/hifiCodec/CMakeLists.txt create mode 100644 plugins/hifiCodec/src/HiFiCodec.cpp create mode 100644 plugins/hifiCodec/src/HiFiCodec.h create mode 100644 plugins/hifiCodec/src/HiFiCodecProvider.cpp create mode 100644 plugins/hifiCodec/src/plugin.json diff --git a/cmake/externals/hifiAudioCodec/CMakeLists.txt b/cmake/externals/hifiAudioCodec/CMakeLists.txt new file mode 100644 index 0000000000..5c563774b7 --- /dev/null +++ b/cmake/externals/hifiAudioCodec/CMakeLists.txt @@ -0,0 +1,50 @@ +include(ExternalProject) +include(SelectLibraryConfigurations) + +set(EXTERNAL_NAME HiFiAudioCodec) + +string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) + +ExternalProject_Add( + ${EXTERNAL_NAME} + URL https://s3.amazonaws.com/hifi-public/dependencies/codecSDK.zip + URL_MD5 4add25b7cc5dfdb3cbfc1156b95cfff7 + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + LOG_DOWNLOAD 1 +) + +# Hide this external target (for ide users) +set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") + +ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) + +set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE TYPE INTERNAL) + +if (WIN32) + set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/Release/audio.lib CACHE TYPE INTERNAL) + + # FIXME need to account for different architectures + #if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + # set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/win64/audio.lib CACHE TYPE INTERNAL) + # add_paths_to_fixup_libs(${SOURCE_DIR}/bin/win64) + #else() + # set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/win32/audio.lib CACHE TYPE INTERNAL) + # add_paths_to_fixup_libs(${SOURCE_DIR}/bin/win32) + #endif() + +elseif(APPLE) + + # FIXME need to account for different architectures + #set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/osx32/audio.dylib CACHE TYPE INTERNAL) + #add_paths_to_fixup_libs(${SOURCE_DIR}/bin/osx32) + +elseif(NOT ANDROID) + + # FIXME need to account for different architectures + #set(${EXTERNAL_NAME_UPPER}_LIBRARIES ${SOURCE_DIR}/lib/linux64/audio.so CACHE TYPE INTERNAL) + #add_paths_to_fixup_libs(${SOURCE_DIR}/bin/linux64) + +endif() + diff --git a/plugins/hifiCodec/CMakeLists.txt b/plugins/hifiCodec/CMakeLists.txt new file mode 100644 index 0000000000..50ba6de54e --- /dev/null +++ b/plugins/hifiCodec/CMakeLists.txt @@ -0,0 +1,21 @@ +# +# Created by Brad Hefta-Gaub on 7/10/2016 +# Copyright 2016 High Fidelity, Inc. +# +# Distributed under the Apache License, Version 2.0. +# See the accompanying file LICENSE or http:#www.apache.org/licenses/LICENSE-2.0.html +# + + + +if (WIN32) + set(TARGET_NAME hifiCodec) + setup_hifi_client_server_plugin() + + link_hifi_libraries(shared plugins) + + add_dependency_external_projects(HiFiAudioCodec) + target_include_directories(${TARGET_NAME} PRIVATE ${HIFIAUDIOCODEC_INCLUDE_DIRS}) + target_link_libraries(${TARGET_NAME} ${HIFIAUDIOCODEC_LIBRARIES}) +endif() + diff --git a/plugins/hifiCodec/src/HiFiCodec.cpp b/plugins/hifiCodec/src/HiFiCodec.cpp new file mode 100644 index 0000000000..03a0b04bb8 --- /dev/null +++ b/plugins/hifiCodec/src/HiFiCodec.cpp @@ -0,0 +1,72 @@ +// +// HiFiCodec.cpp +// plugins/hifiCodec/src +// +// Created by Brad Hefta-Gaub on 7/10/2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include + +#include // should be from the external... + +#include + +#include "HiFiCodec.h" + +const QString HiFiCodec::NAME = "hifiAC"; + +void HiFiCodec::init() { +} + +void HiFiCodec::deinit() { +} + +bool HiFiCodec::activate() { + CodecPlugin::activate(); + return true; +} + +void HiFiCodec::deactivate() { + CodecPlugin::deactivate(); +} + + +bool HiFiCodec::isSupported() const { + return true; +} + +class HiFiEncoder : public Encoder { +public: + virtual void encode(const QByteArray& decodedBuffer, QByteArray& encodedBuffer) override { + encodedBuffer = decodedBuffer; + } +}; + +class HiFiDecoder : public Decoder { +public: + virtual void decode(const QByteArray& encodedBuffer, QByteArray& decodedBuffer) override { + decodedBuffer = encodedBuffer; + } + + virtual void trackLostFrames(int numFrames) override { } +}; + +Encoder* HiFiCodec::createEncoder(int sampleRate, int numChannels) { + return new HiFiEncoder(); +} + +Decoder* HiFiCodec::createDecoder(int sampleRate, int numChannels) { + return new HiFiDecoder(); +} + +void HiFiCodec::releaseEncoder(Encoder* encoder) { + delete encoder; +} + +void HiFiCodec::releaseDecoder(Decoder* decoder) { + delete decoder; +} diff --git a/plugins/hifiCodec/src/HiFiCodec.h b/plugins/hifiCodec/src/HiFiCodec.h new file mode 100644 index 0000000000..eeba8d56d8 --- /dev/null +++ b/plugins/hifiCodec/src/HiFiCodec.h @@ -0,0 +1,42 @@ +// +// HiFiCodec.h +// plugins/hifiCodec/src +// +// Created by Brad Hefta-Gaub on 7/10/2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_HiFiCodec_h +#define hifi_HiFiCodec_h + +#include + +class HiFiCodec : public CodecPlugin { + Q_OBJECT + +public: + // Plugin functions + bool isSupported() const override; + const QString& getName() const override { return NAME; } + + void init() override; + void deinit() override; + + /// Called when a plugin is being activated for use. May be called multiple times. + bool activate() override; + /// Called when a plugin is no longer being used. May be called multiple times. + void deactivate() override; + + virtual Encoder* createEncoder(int sampleRate, int numChannels) override; + virtual Decoder* createDecoder(int sampleRate, int numChannels) override; + virtual void releaseEncoder(Encoder* encoder) override; + virtual void releaseDecoder(Decoder* decoder) override; + +private: + static const QString NAME; +}; + +#endif // hifi_HiFiCodec_h diff --git a/plugins/hifiCodec/src/HiFiCodecProvider.cpp b/plugins/hifiCodec/src/HiFiCodecProvider.cpp new file mode 100644 index 0000000000..b9698cc821 --- /dev/null +++ b/plugins/hifiCodec/src/HiFiCodecProvider.cpp @@ -0,0 +1,46 @@ +// +// Created by Brad Hefta-Gaub on 7/10/2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include + +#include +#include +#include + +#include +#include + +#include "HiFiCodec.h" + +class HiFiCodecProvider : public QObject, public CodecProvider { + Q_OBJECT + Q_PLUGIN_METADATA(IID CodecProvider_iid FILE "plugin.json") + Q_INTERFACES(CodecProvider) + +public: + HiFiCodecProvider(QObject* parent = nullptr) : QObject(parent) {} + virtual ~HiFiCodecProvider() {} + + virtual CodecPluginList getCodecPlugins() override { + static std::once_flag once; + std::call_once(once, [&] { + + CodecPluginPointer hiFiCodec(new HiFiCodec()); + if (hiFiCodec->isSupported()) { + _codecPlugins.push_back(hiFiCodec); + } + + }); + return _codecPlugins; + } + +private: + CodecPluginList _codecPlugins; +}; + +#include "HiFiCodecProvider.moc" diff --git a/plugins/hifiCodec/src/plugin.json b/plugins/hifiCodec/src/plugin.json new file mode 100644 index 0000000000..df26a67ea8 --- /dev/null +++ b/plugins/hifiCodec/src/plugin.json @@ -0,0 +1 @@ +{"name":"HiFi 4:1 Audio Codec"}