commit 05430b7757616a3ea799dca7c499cffb4e3cef7c Author: James Shiffer <2191476+scoliono@users.noreply.github.com> Date: Tue Aug 6 22:25:48 2024 -0700 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f07380b --- /dev/null +++ b/.gitignore @@ -0,0 +1,93 @@ +build/ +config.h + +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps +CMakeUserPresets.json + +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f7d733c --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "qxmpp"] + path = qxmpp + url = https://github.com/qxmpp-project/qxmpp diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/QtSettings.xml b/.idea/QtSettings.xml new file mode 100644 index 0000000..d082c1d --- /dev/null +++ b/.idea/QtSettings.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/VocaSTI.iml b/.idea/VocaSTI.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/.idea/VocaSTI.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/editor.xml b/.idea/editor.xml new file mode 100644 index 0000000..855412d --- /dev/null +++ b/.idea/editor.xml @@ -0,0 +1,103 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..59f2f77 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..ca2e226 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..3e5bcd3 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a7dc784 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.15) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +project(VocaSTI VERSION 0.1.0 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) + +add_executable(VocaSTI + main.cpp + main.h + config.h +) + +find_package(Qt6 COMPONENTS Core Network Xml REQUIRED) +find_package(QXmppQt6 CONFIG REQUIRED) +find_package(GStreamer REQUIRED) +find_package(GLIB2 REQUIRED) +find_package(GObject REQUIRED) + +target_link_libraries(VocaSTI + PRIVATE + Qt6::Core + Qt6::Network + Qt6::Xml + QXmpp::QXmpp + ${GSTREAMER_LIBRARY} + ${GLIB2_LIBRARIES} + ${GOBJECT_LIBRARIES} +) + +target_include_directories(VocaSTI + PRIVATE + ${GSTREAMER_INCLUDE_DIRS} + ${GLIB2_INCLUDE_DIR} + ${GOBJECT_INCLUDE_DIR} + /usr/local/include/QXmppQt6 +) diff --git a/README.md b/README.md new file mode 100644 index 0000000..d46002b --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# Vocaloid STI (Synthesizer Telephonic Interface) + +Call or text Hatsune Miku. + +[+1 (571) 669-3939](tel:+15716693939) + + + +## Build Instructions + +Make sure you have Qt 6, GStreamer and CMake installed. + +First, clone this repo and the qxmpp submodule. Inside of the qxmpp directory, run: + +```sh +mkdir build +cd build +cmake .. -DWITH_GSTREAMER=ON -DQT_VERSION_MAJOR=6 +cmake --build . -j$(nproc) +sudo cmake --build . --target install +``` + +Copy `config_example.h` to `config.h` and fill in the necessary credentials. + +Then from this repo's root, run: + +```sh +mkdir build +cd build +cmake .. +cmake --build . -j$(nproc) +``` diff --git a/cmake/FindGLIB2.cmake b/cmake/FindGLIB2.cmake new file mode 100644 index 0000000..30a5dfd --- /dev/null +++ b/cmake/FindGLIB2.cmake @@ -0,0 +1,87 @@ +# SPDX-FileCopyrightText: 2008 Laurent Montel +# +# SPDX-License-Identifier: LicenseRef-MIT-variant + +# - Try to find the GLIB2 libraries +# Once done this will define +# +# GLIB2_FOUND - system has glib2 +# GLIB2_INCLUDE_DIR - the glib2 include directory +# GLIB2_LIBRARIES - glib2 library + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +if(GLIB2_INCLUDE_DIR AND GLIB2_LIBRARIES) + # Already in cache, be silent + set(GLIB2_FIND_QUIETLY TRUE) +endif(GLIB2_INCLUDE_DIR AND GLIB2_LIBRARIES) + +if (NOT WIN32) + find_package(PkgConfig QUIET) + if(PKG_CONFIG_FOUND) + pkg_check_modules(PKG_GLIB QUIET glib-2.0) + endif() +endif(NOT WIN32) + +find_path(GLIB2_MAIN_INCLUDE_DIR glib.h + PATH_SUFFIXES glib-2.0 + HINTS ${PKG_GLIB_INCLUDE_DIRS} ${PKG_GLIB_INCLUDEDIR}) + +# search the glibconfig.h include dir under the same root where the library is found +find_library(GLIB2_LIBRARIES + NAMES glib-2.0 + HINTS ${PKG_GLIB_LIBRARY_DIRS} ${PKG_GLIB_LIBDIR}) + +find_path(GLIB2_INTERNAL_INCLUDE_DIR glibconfig.h + PATH_SUFFIXES glib-2.0/include ../lib/glib-2.0/include + HINTS ${PKG_GLIB_INCLUDE_DIRS} ${PKG_GLIB_LIBRARIES} ${CMAKE_SYSTEM_LIBRARY_PATH}) + +set(GLIB2_INCLUDE_DIR ${GLIB2_MAIN_INCLUDE_DIR}) + +# not sure if this include dir is optional or required +# for now it is optional +if(GLIB2_INTERNAL_INCLUDE_DIR) + set(GLIB2_INCLUDE_DIR ${GLIB2_INCLUDE_DIR} ${GLIB2_INTERNAL_INCLUDE_DIR}) +endif(GLIB2_INTERNAL_INCLUDE_DIR) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(GLIB2 DEFAULT_MSG GLIB2_LIBRARIES GLIB2_MAIN_INCLUDE_DIR) + +mark_as_advanced(GLIB2_INCLUDE_DIR GLIB2_LIBRARIES) + + +find_program(GLIB2_GENMARSHAL_UTIL glib-genmarshal) + +macro(glib2_genmarshal output_name) + file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/genmarshal_tmp) + foreach(_declaration ${ARGN}) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/genmarshal_tmp "${_declaration}\n") + endforeach() + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${output_name}.h ${CMAKE_CURRENT_BINARY_DIR}/${output_name}.c + COMMAND ${GLIB2_GENMARSHAL_UTIL} --header genmarshal_tmp > ${output_name}.h + COMMAND ${GLIB2_GENMARSHAL_UTIL} --body genmarshal_tmp > ${output_name}.c + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) +endmacro() diff --git a/cmake/FindGObject.cmake b/cmake/FindGObject.cmake new file mode 100644 index 0000000..6f43bc8 --- /dev/null +++ b/cmake/FindGObject.cmake @@ -0,0 +1,84 @@ +# SPDX-FileCopyrightText: Tim Beaulen +# SPDX-FileCopyrightText: Helio Chissini de Castro +# +# SPDX-License-Identifier: LicenseRef-MIT-variant + +# - Try to find GObject +# Once done this will define +# +# GOBJECT_FOUND - system has GObject +# GOBJECT_INCLUDE_DIR - the GObject include directory +# GOBJECT_LIBRARIES - the libraries needed to use GObject +# GOBJECT_DEFINITIONS - Compiler switches required for using GObject + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +IF (GOBJECT_INCLUDE_DIR AND GOBJECT_LIBRARIES) + # in cache already + SET(GObject_FIND_QUIETLY TRUE) +ELSE (GOBJECT_INCLUDE_DIR AND GOBJECT_LIBRARIES) + SET(GObject_FIND_QUIETLY FALSE) +ENDIF (GOBJECT_INCLUDE_DIR AND GOBJECT_LIBRARIES) + +IF (NOT WIN32) + FIND_PACKAGE(PkgConfig REQUIRED) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + PKG_CHECK_MODULES(PKG_GOBJECT2 REQUIRED gobject-2.0) + SET(GOBJECT_DEFINITIONS ${PKG_GOBJECT2_CFLAGS}) +ENDIF (NOT WIN32) + +FIND_PATH(GOBJECT_INCLUDE_DIR gobject/gobject.h + HINTS ${PKG_GOBJECT2_INCLUDE_DIRS} ${PKG_GOBJECT2_INCLUDEDIR} + PATHS /usr/include/glib-2.0/ + PATH_SUFFIXES glib-2.0 + ) + +FIND_LIBRARY(_GObjectLibs NAMES gobject-2.0 + HINTS + ${PKG_GOBJECT2_LIBRARY_DIRS} + ${PKG_GOBJECT2_LIBDIR} + ) +FIND_LIBRARY(_GModuleLibs NAMES gmodule-2.0 + HINTS + ${PKG_GOBJECT2_LIBRARY_DIRS} + ${PKG_GOBJECT2_LIBDIR} + ) +FIND_LIBRARY(_GThreadLibs NAMES gthread-2.0 + HINTS + ${PKG_GOBJECT2_LIBRARY_DIRS} + ${PKG_GOBJECT2_LIBDIR} + ) +FIND_LIBRARY(_GLibs NAMES glib-2.0 + HINTS + ${PKG_GOBJECT2_LIBRARY_DIRS} + ${PKG_GOBJECT2_LIBDIR} + ) + +SET (GOBJECT_LIBRARIES ${_GObjectLibs} ${_GModuleLibs} ${_GThreadLibs} ${_GLibs}) + +MARK_AS_ADVANCED(GOBJECT_INCLUDE_DIR GOBJECT_LIBRARIES) + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(GObject DEFAULT_MSG GOBJECT_INCLUDE_DIR GOBJECT_LIBRARIES) diff --git a/cmake/FindGStreamer.cmake b/cmake/FindGStreamer.cmake new file mode 100644 index 0000000..3ae6ca6 --- /dev/null +++ b/cmake/FindGStreamer.cmake @@ -0,0 +1,173 @@ +# SPDX-FileCopyrightText: 2010 Collabora Ltd., George Kiagiadakis +# +# SPDX-License-Identifier: LicenseRef-MIT-variant + +# - Try to find GStreamer +# Once done this will define +# +# GSTREAMER_FOUND - system has GStreamer +# GSTREAMER_INCLUDE_DIR - the GStreamer main include directory +# GSTREAMER_INCLUDE_DIRS - the GStreamer include directories +# GSTREAMER_LIBRARY - the main GStreamer library +# GSTREAMER_PLUGIN_DIR - the GStreamer plugin directory +# +# And for all the plugin libraries specified in the COMPONENTS +# of find_package, this module will define: +# +# GSTREAMER__LIBRARY_FOUND - system has +# GSTREAMER__LIBRARY - the library +# GSTREAMER__INCLUDE_DIR - the include directory + +# Copyright (c) 2010, Collabora Ltd. +# @author George Kiagiadakis +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +if (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARY) + set(GStreamer_FIND_QUIETLY TRUE) +else() + set(GStreamer_FIND_QUIETLY FALSE) +endif() + +set(GSTREAMER_ABI_VERSION "1.0") + + +# Find the main library +find_package(PkgConfig) + +if (PKG_CONFIG_FOUND) + pkg_check_modules(PKG_GSTREAMER QUIET gstreamer-${GSTREAMER_ABI_VERSION}) + if(PKG_GSTREAMER_FOUND) + exec_program(${PKG_CONFIG_EXECUTABLE} + ARGS --variable pluginsdir gstreamer-${GSTREAMER_ABI_VERSION} + OUTPUT_VARIABLE PKG_GSTREAMER_PLUGIN_DIR) + endif() + set(GSTREAMER_DEFINITIONS ${PKG_GSTREAMER_CFLAGS}) +endif() + +find_library(GSTREAMER_LIBRARY + NAMES gstreamer-${GSTREAMER_ABI_VERSION} + HINTS ${PKG_GSTREAMER_LIBRARY_DIRS} ${PKG_GSTREAMER_LIBDIR}) + +find_path(GSTREAMER_INCLUDE_DIR + gst/gst.h + HINTS ${PKG_GSTREAMER_INCLUDE_DIRS} ${PKG_GSTREAMER_INCLUDEDIR} + PATH_SUFFIXES gstreamer-${GSTREAMER_ABI_VERSION}) + +find_path(GSTREAMER_gstconfig_INCLUDE_DIR + gst/gstconfig.h + HINTS ${PKG_GSTREAMER_INCLUDE_DIRS} ${PKG_GSTREAMER_INCLUDEDIR} + PATH_SUFFIXES gstreamer-${GSTREAMER_ABI_VERSION}) + +set(GSTREAMER_INCLUDE_DIRS ${GSTREAMER_INCLUDE_DIR} ${GSTREAMER_gstconfig_INCLUDE_DIR}) +list(REMOVE_DUPLICATES GSTREAMER_INCLUDE_DIRS) + +if (PKG_GSTREAMER_PLUGIN_DIR) + set(_GSTREAMER_PLUGIN_DIR ${PKG_GSTREAMER_PLUGIN_DIR}) +else() + get_filename_component(_GSTREAMER_LIB_DIR ${GSTREAMER_LIBRARY} PATH) + set(_GSTREAMER_PLUGIN_DIR ${_GSTREAMER_LIB_DIR}/gstreamer-${GSTREAMER_ABI_VERSION}) +endif() + +set(GSTREAMER_PLUGIN_DIR ${_GSTREAMER_PLUGIN_DIR} + CACHE PATH "The path to the gstreamer plugins installation directory") + +mark_as_advanced(GSTREAMER_LIBRARY + GSTREAMER_INCLUDE_DIR + GSTREAMER_gstconfig_INCLUDE_DIR + GSTREAMER_PLUGIN_DIR) + + +# Find additional libraries +include(MacroFindGStreamerLibrary) + +macro(_find_gst_component _name _header) + find_gstreamer_library(${_name} ${_header} ${GSTREAMER_ABI_VERSION} ${GStreamer_FIND_QUIETLY}) + set(_GSTREAMER_EXTRA_VARIABLES ${_GSTREAMER_EXTRA_VARIABLES} + GSTREAMER_${_name}_LIBRARY GSTREAMER_${_name}_INCLUDE_DIR) +endmacro() + +foreach(_component ${GStreamer_FIND_COMPONENTS}) + if (${_component} STREQUAL "base") + _find_gst_component(BASE gstbasesink.h) + elseif (${_component} STREQUAL "check") + _find_gst_component(CHECK gstcheck.h) + elseif (${_component} STREQUAL "controller") + _find_gst_component(CONTROLLER gstargbcontrolbinding.h) + elseif (${_component} STREQUAL "net") + _find_gst_component(NET gstnet.h) + else() + message (AUTHOR_WARNING "FindGStreamerPluginsBase.cmake: Invalid component \"${_component}\" was specified") + endif() +endforeach() + + +# Version check +if (GStreamer_FIND_VERSION) + if (PKG_GSTREAMER_FOUND) + if("${PKG_GSTREAMER_VERSION}" VERSION_LESS "${GStreamer_FIND_VERSION}") + if(NOT GStreamer_FIND_QUIETLY) + message(STATUS "Found GStreamer version ${PKG_GSTREAMER_VERSION}, but at least version ${GStreamer_FIND_VERSION} is required") + endif() + set(GSTREAMER_VERSION_COMPATIBLE FALSE) + else() + set(GSTREAMER_VERSION_COMPATIBLE TRUE) + endif() + elseif(GSTREAMER_INCLUDE_DIR) + include(CheckCXXSourceCompiles) + + set(CMAKE_REQUIRED_INCLUDES ${GSTREAMER_INCLUDE_DIR}) + string(REPLACE "." "," _comma_version ${GStreamer_FIND_VERSION}) + # Hack to invalidate the cached value + set(GSTREAMER_VERSION_COMPATIBLE GSTREAMER_VERSION_COMPATIBLE) + + check_cxx_source_compiles(" +#define G_BEGIN_DECLS +#define G_END_DECLS +#include + +#if GST_CHECK_VERSION(${_comma_version}) +int main() { return 0; } +#else +# error \"GStreamer version incompatible\" +#endif +" GSTREAMER_VERSION_COMPATIBLE) + + if (NOT GSTREAMER_VERSION_COMPATIBLE AND NOT GStreamer_FIND_QUIETLY) + message(STATUS "GStreamer ${GStreamer_FIND_VERSION} is required, but the version found is older") + endif() + else() + # We didn't find gstreamer at all + set(GSTREAMER_VERSION_COMPATIBLE FALSE) + endif() +else() + # No version constrain was specified, thus we consider the version compatible + set(GSTREAMER_VERSION_COMPATIBLE TRUE) +endif() + + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(GStreamer DEFAULT_MSG + GSTREAMER_LIBRARY GSTREAMER_INCLUDE_DIRS + GSTREAMER_VERSION_COMPATIBLE ${_GSTREAMER_EXTRA_VARIABLES}) diff --git a/cmake/MacroFindGStreamerLibrary.cmake b/cmake/MacroFindGStreamerLibrary.cmake new file mode 100644 index 0000000..e69fc64 --- /dev/null +++ b/cmake/MacroFindGStreamerLibrary.cmake @@ -0,0 +1,81 @@ +# SPDX-FileCopyrightText: 2010 Collabora Ltd., George Kiagiadakis +# +# SPDX-License-Identifier: LicenseRef-MIT-variant + +# - macro find_gstreamer_library + +# Copyright (c) 2010, Collabora Ltd. +# @author George Kiagiadakis +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +macro(find_gstreamer_library _name _header _abi_version _quiet) + string(TOLOWER ${_name} _lower_name) + string(TOUPPER ${_name} _upper_name) + + if (GSTREAMER_${_upper_name}_LIBRARY AND GSTREAMER_${_upper_name}_INCLUDE_DIR) + set(_GSTREAMER_${_upper_name}_QUIET TRUE) + else() + set(_GSTREAMER_${_upper_name}_QUIET FALSE) + endif() + + if (PKG_CONFIG_FOUND) + pkg_check_modules(PKG_GSTREAMER_${_upper_name} QUIET gstreamer-${_lower_name}-${_abi_version}) + endif() + + find_library(GSTREAMER_${_upper_name}_LIBRARY + NAMES gst${_lower_name}-${_abi_version} + HINTS ${PKG_GSTREAMER_${_upper_name}_LIBRARY_DIRS} + ${PKG_GSTREAMER_${_upper_name}_LIBDIR} + ) + + find_path(GSTREAMER_${_upper_name}_INCLUDE_DIR + gst/${_lower_name}/${_header} + HINTS ${PKG_GSTREAMER_${_upper_name}_INCLUDE_DIRS} + ${PKG_GSTREAMER_${_upper_name}_INCLUDEDIR} + PATH_SUFFIXES gstreamer-${_abi_version} + ) + + if (GSTREAMER_${_upper_name}_LIBRARY AND GSTREAMER_${_upper_name}_INCLUDE_DIR) + set(GSTREAMER_${_upper_name}_LIBRARY_FOUND TRUE) + else() + set(GSTREAMER_${_upper_name}_LIBRARY_FOUND FALSE) + endif() + + if (NOT _GSTREAMER_${_upper_name}_QUIET AND NOT _quiet) + if (GSTREAMER_${_upper_name}_LIBRARY) + message(STATUS "Found GSTREAMER_${_upper_name}_LIBRARY: ${GSTREAMER_${_upper_name}_LIBRARY}") + else() + message(STATUS "Could NOT find GSTREAMER_${_upper_name}_LIBRARY") + endif() + + if (GSTREAMER_${_upper_name}_INCLUDE_DIR) + message(STATUS "Found GSTREAMER_${_upper_name}_INCLUDE_DIR: ${GSTREAMER_${_upper_name}_INCLUDE_DIR}") + else() + message(STATUS "Could NOT find GSTREAMER_${_upper_name}_INCLUDE_DIR") + endif() + endif() + + mark_as_advanced(GSTREAMER_${_upper_name}_LIBRARY GSTREAMER_${_upper_name}_INCLUDE_DIR) +endmacro() diff --git a/config_example.h b/config_example.h new file mode 100644 index 0000000..e012081 --- /dev/null +++ b/config_example.h @@ -0,0 +1,11 @@ +// +// Copy this file to "config.h" +// + +#ifndef VOCASTI_CONFIG_H_ +#define VOCASTI_CONFIG_H_ + +#define VOCASTI_XMPP_EMAIL "EMAIL@linux.ucla.edu" +#define VOCASTI_XMPP_PASSWD "password" + +#endif // VOCASTI_CONFIG_H_ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..6458b92 --- /dev/null +++ b/main.cpp @@ -0,0 +1,90 @@ +#include "main.h" +#include "config.h" +#include +#include +#include +#include + + +VocaXmppClient::VocaXmppClient(QObject *parent) + : QXmppClient(parent), m_call(nullptr) +{ + // Add the extension for Jingle (Voice/Video calls). + addExtension(&m_callManager); + + connect(this, &QXmppClient::messageReceived, this, &VocaXmppClient::messageReceived); + connect(&m_callManager, &QXmppCallManager::callReceived, this, &VocaXmppClient::callReceived); + connect(&m_callManager, &QXmppCallManager::callStarted, this, &VocaXmppClient::callStarted); +} + +VocaXmppClient::~VocaXmppClient() +{ +} + +void VocaXmppClient::messageReceived(const QXmppMessage &message) +{ + QString from = message.from(); + QString msg = message.body(); + + // sendPacket(QXmppMessage("", from, "Your message: " + msg)); +} + +void VocaXmppClient::callConnected() +{ + +} + +int VocaXmppClient::setupPipe() +{ + GstElement* wavenc = gst_element_factory_make("wavenc", "wavenc"); + GstElement* sink = gst_element_factory_make("filesink", "sink"); + + if (!wavenc || !sink) + { + gst_printerr("Not all elements could be created\n"); + } + GstElement* pipe = m_call->pipeline(); + gst_bin_add_many(GST_BIN(pipe), wavenc, sink, NULL); + if (!gst_element_link_many(wavenc, sink, NULL)) + { + gst_printerr("Elements could not be linked\n"); + return -1; + } + + return 0; +} + +void VocaXmppClient::callReceived(QXmppCall *call) +{ + m_call = call; + connect(m_call, &QXmppCall::connected, this, &VocaXmppClient::callConnected); + connect(m_call, &QXmppCall::finished, this, &VocaXmppClient::callFinished); + //connect(m_call, &QXmppCall::audioModeChanged, this, &VocaXmppClient::audioModeChanged); + m_call->accept(); + + setupPipe(); +} + +void VocaXmppClient::callStarted(QXmppCall *call) +{ + m_call = call; +} + +void VocaXmppClient::callFinished() +{ + disconnect(m_call, &QXmppCall::connected, this, &VocaXmppClient::callConnected); + disconnect(m_call, &QXmppCall::finished, this, &VocaXmppClient::callFinished); + //disconnect(m_call, &QXmppCall::audioModeChanged, this, &VocaXmppClient::audioModeChanged); + m_call = nullptr; +} + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + + VocaXmppClient client; + client.logger()->setLoggingType(QXmppLogger::StdoutLogging); + client.connectToServer(VOCASTI_XMPP_EMAIL, VOCASTI_XMPP_PASSWD); + + return app.exec(); +} diff --git a/main.h b/main.h new file mode 100644 index 0000000..755a149 --- /dev/null +++ b/main.h @@ -0,0 +1,33 @@ +#ifndef VOCASTI_MAIN_H_ +#define VOCASTI_MAIN_H_ + +#include +#include +#include +#include + +class VocaXmppClient : public QXmppClient +{ + Q_OBJECT + +public: + VocaXmppClient(QObject *parent = nullptr); + ~VocaXmppClient() override; + +private slots: + void messageReceived(const QXmppMessage &); + void callConnected(); + void callReceived(QXmppCall *call); + void callStarted(QXmppCall *call); + void callFinished(); + +protected: + int setupPipe(); + + QXmppCall *m_call; + QXmppCallManager m_callManager; + QTimer m_timer; + +}; + +#endif // VOCASTI_MAIN_H_ diff --git a/miku.webp b/miku.webp new file mode 100755 index 0000000..50f0f95 Binary files /dev/null and b/miku.webp differ diff --git a/qxmpp b/qxmpp new file mode 160000 index 0000000..7c189b0 --- /dev/null +++ b/qxmpp @@ -0,0 +1 @@ +Subproject commit 7c189b0cad72ad90134075586d7742f0fd4e7e1d