diff --git a/.travis.yml b/.travis.yml index 06f1e4fb..a3710f0c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,31 @@ before_script: - ./configure && make -j3 - sudo make install - cd .. +# installing libopus, needed for audio encoding/decoding + - wget http://downloads.xiph.org/releases/opus/opus-1.0.3.tar.gz + - tar xzvf opus-1.0.3.tar.gz + - cd opus-1.0.3 + - ./configure && make -j3 + - sudo make install + - cd .. +# installing libsdl1.2, needed for displaying video frames + - wget http://www.libsdl.org/release/SDL-1.2.15.tar.gz + - tar -xvzf SDL-1.2.15.tar.gz + - cd SDL-1.2.15 + - ./configure && make -j3 + - sudo make install + - cd .. +# installing libopenal, needed for audio capture/playback + - sudo apt-get install libopenal-dev +# installing yasm, needed for compiling ffmpeg + - sudo apt-get install yasm +# installing ffmpeg, needed for capturing and encoding/decoding video + - wget https://www.ffmpeg.org/releases/ffmpeg-2.0.2.tar.gz + - tar -xvzf ffmpeg-2.0.2.tar.gz + - cd ffmpeg-2.0.2 + - ./configure && make -j3 + - sudo make install + - cd .. # creating librarys' links and updating cache - sudo ldconfig # installing check, needed for unit tests diff --git a/Makefile.am b/Makefile.am index ac24c6b7..9c44ea96 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,7 +10,7 @@ CLEANFILES = $(top_builddir)/libtoxcore.pc EXTRA_DIST = \ - $(top_srcdir)/libtoxcore.pc.in \ + libtoxcore.pc.in \ $(top_srcdir)/docs/updates/Crypto.md \ $(top_srcdir)/docs/updates/Spam-Prevention.md \ $(top_srcdir)/docs/updates/Symmetric-NAT-Transversal.md \ diff --git a/build/Makefile.am b/build/Makefile.am index 631ec111..9530e1a7 100644 --- a/build/Makefile.am +++ b/build/Makefile.am @@ -1,9 +1,12 @@ bin_PROGRAMS = noinst_PROGRAMS = +lib_LTLIBRARIES = noinst_bindir = $(top_builddir)/build EXTRA_DIST= include ../toxcore/Makefile.inc +include ../toxrtp/Makefile.inc +include ../toxmsi/Makefile.inc include ../other/Makefile.inc include ../testing/Makefile.inc include ../other/bootstrap_serverdaemon/Makefile.inc diff --git a/configure.ac b/configure.ac index 81f15eca..dba051c7 100644 --- a/configure.ac +++ b/configure.ac @@ -10,7 +10,11 @@ AM_INIT_AUTOMAKE([1.10 -Wall subdir-objects]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) AC_CONFIG_MACRO_DIR([m4]) +EXTRA_LT_LDFLAGS= + LIBTOXCORE_LT_VERSION=0:0:0 +LIBTOXMSI_LT_VERSION=0:0:0 +LIBTOXRTP_LT_VERSION=0:0:0 dnl dnl current:revision:age dnl @@ -19,7 +23,13 @@ dnl revision: increment if source code has changed, set to zero if current is dnl incremented dnl age: increment if interfaces have been added, set to zero if dnl interfaces have been removed or changed -EXTRA_LT_LDFLAGS="-version-info $LIBTOXCORE_LT_VERSION" +TOXCORE_LT_LDFLAGS="-version-info $LIBTOXCORE_LT_VERSION" +TOXMSI_LT_LDFLAGS="-version-info $LIBTOXMSI_LT_VERSION" +TOXRTP_LT_LDFLAGS="-version-info $LIBTOXMSI_LT_VERSION" + +AC_SUBST(TOXCORE_LT_LDFLAGS) +AC_SUBST(TOXMSI_LT_LDFLAGS) +AC_SUBST(TOXRTP_LT_LDFLAGS) if test "x${prefix}" = "xNONE"; then prefix="${ac_default_prefix}" @@ -28,6 +38,7 @@ fi BUILD_DHT_BOOTSTRAP_DAEMON="yes" BUILD_NTOX="yes" BUILD_TESTS="yes" +BUILD_AV="yes" BUILD_TESTING="yes" NCURSES_FOUND="no" @@ -46,6 +57,19 @@ AC_ARG_ENABLE([nacl], ] ) +PKG_PROG_PKG_CONFIG + +AC_ARG_ENABLE([av], + [AC_HELP_STRING([--disable-av], [build AV support libraries (default: auto)]) ], + [ + if test "x$enableval" = "xno"; then + BUILD_AV="no" + elif test "x$enableval" = "xyes"; then + BUILD_AV="yes" + fi + ] +) + AC_ARG_ENABLE([tests], [AC_HELP_STRING([--disable-tests], [build unit tests (default: auto)]) ], [ @@ -314,8 +338,95 @@ AC_TYPE_UINT8_T AC_FUNC_FORK AC_CHECK_FUNCS([gettimeofday memset socket strchr malloc]) -# pkg-config based tests -PKG_PROG_PKG_CONFIG +if test "x$BUILD_AV" = "xyes"; then + AX_PTHREAD( + [], + [ + AC_MSG_WARN([disabling AV support: required pthread library not found]) + BUILD_AV="no" + ] + ) +fi + +if test "x$BUILD_AV" = "xyes"; then + PKG_CHECK_MODULES([AVFORMAT], [libavformat], + [], + [ + AC_MSG_WARN([disabling AV support $AVFORMAT_PKG_ERRORS]) + BUILD_AV="no" + ] + ) +fi + +if test "x$BUILD_AV" = "xyes"; then + PKG_CHECK_MODULES([AVCODEC], [libavcodec], + [], + [ + AC_MSG_WARN([disabling AV support $AVCODEC_PKG_ERRORS]) + BUILD_AV="no" + ] + ) +fi + +if test "x$BUILD_AV" = "xyes"; then + PKG_CHECK_MODULES([AVUTIL], [libavutil], + [], + [ + AC_MSG_WARN([disabling AV support $AVUTIL_PKG_ERRORS]) + BUILD_AV="no" + ] + ) +fi + +if test "x$BUILD_AV" = "xyes"; then + PKG_CHECK_MODULES([AVDEVICE], [libavdevice], + [], + [ + AC_MSG_WARN([disabling AV support $AVDEVICE_PKG_ERRORS]) + BUILD_AV="no" + ] + ) +fi + +if test "x$BUILD_AV" = "xyes"; then + PKG_CHECK_MODULES([SWSCALE], [libswscale], + [], + [ + AC_MSG_WARN([disabling AV support $SWSCALE_PKG_ERRORS]) + BUILD_AV="no" + ] + ) +fi + +if test "x$BUILD_AV" = "xyes"; then + PKG_CHECK_MODULES([SDL], [sdl], + [], + [ + AC_MSG_WARN([disabling AV support $SDL_PKG_ERRORS]) + BUILD_AV="no" + ] + ) +fi + +if test "x$BUILD_AV" = "xyes"; then + PKG_CHECK_MODULES([OPENAL], [openal], + [], + [ + AC_MSG_WARN([disabling AV support $OPENAL_PKG_ERRORS]) + BUILD_AV="no" + ] + ) +fi + +if test "x$BUILD_AV" = "xyes"; then + PKG_CHECK_MODULES([OPUS], [opus], + [], + [ + AC_MSG_WARN([disabling AV support $OPUS_PKG_ERRORS]) + BUILD_AV="no" + ] + ) +fi if test -n "$PKG_CONFIG"; then if test "x$BUILD_TESTS" = "xyes"; then @@ -351,7 +462,7 @@ if test -n "$PKG_CONFIG"; then ]) fi else - AC_MSG_WARN([pkg-config was not found on your system]) + AC_MSG_WARN([pkg-config was not found on your system, will search for libraries manually]) fi if (test "x$BUILD_NTOX" = "xyes") && (test "x$NCURSES_FOUND" != "xyes"); then @@ -474,6 +585,7 @@ fi AM_CONDITIONAL(BUILD_DHT_BOOTSTRAP_DAEMON, test "x$BUILD_DHT_BOOTSTRAP_DAEMON" = "xyes") AM_CONDITIONAL(BUILD_TESTS, test "x$BUILD_TESTS" = "xyes") AM_CONDITIONAL(BUILD_NTOX, test "x$BUILD_NTOX" = "xyes") +AM_CONDITIONAL(BUILD_AV, test "x$BUILD_AV" = "xyes") AM_CONDITIONAL(BUILD_TESTING, test "x$BUILD_TESTING" = "xyes") AC_CONFIG_FILES([Makefile diff --git a/docs/av_api.md b/docs/av_api.md new file mode 100644 index 00000000..08e05a6d --- /dev/null +++ b/docs/av_api.md @@ -0,0 +1,156 @@ +A/V API reference + +Take toxmsi/phone.c as a reference + +Initialization: + +phone_t* initPhone(uint16_t _listen_port, uint16_t _send_port); +function initializes sample phone. _listen_port and _send_port are variables only meant +for local testing. You will not have to do anything regarding to that since +everything will be started within a mesenger. + + +Phone requires one msi session and two rtp sessions ( one for audio and one for +video ). + +msi_session_t* msi_init_session( void* _core_handler, const uint8_t* _user_agent ); + +initializes msi session. +Params: +void* _core_handler - pointer to an object handling networking, +const uint8_t* _user_agent - string describing phone client version. + +Return value: +msi_session_t* - pointer to a newly created msi session handler. + +msi_session_t reference: + +How to handle msi session: +Controling is done via callbacks and action handlers. +First register callbacks for every state/action received and make sure +NOT TO PLACE SOMETHING LIKE LOOPS THAT TAKES A LOT OF TIME TO EXECUTE; every callback is being called +directly from event loop. You can find examples in phone.c. + +Register callbacks: +void msi_register_callback_call_started ( MCALLBACK ); +void msi_register_callback_call_canceled ( MCALLBACK ); +void msi_register_callback_call_rejected ( MCALLBACK ); +void msi_register_callback_call_ended ( MCALLBACK ); + +void msi_register_callback_recv_invite ( MCALLBACK ); +void msi_register_callback_recv_ringing ( MCALLBACK ); +void msi_register_callback_recv_starting ( MCALLBACK ); +void msi_register_callback_recv_ending ( MCALLBACK ); +void msi_register_callback_recv_error ( MCALLBACK ); + +void msi_register_callback_requ_timeout ( MCALLBACK ); + +MCALLBACK is defined as: void (*callback) (void* _arg) +msi_session_t* handler is being thrown as _arg so you can use that and _agent_handler to get to your own phone handler +directly from callback. + + +Actions: +int msi_invite ( msi_session_t* _session, call_type _call_type, uint32_t _timeoutms ); +Sends call invite. Before calling/sending invite msi_session_t::_friend_id is needed to be set or else +it will not work. _call_type is type of the call ( Audio/Video ) and _timeoutms is how long +will poll wait until request is terminated. + +int msi_hangup ( msi_session_t* _session ); +Hangs up active call + +int msi_answer ( msi_session_t* _session, call_type _call_type ); +Answer incomming call. _call_type set's callee call type. + +int msi_cancel ( msi_session_t* _session ); +Cancel current request. + +int msi_reject ( msi_session_t* _session ); +Reject incomming call. + + + + +Now for rtp: +You will need 2 sessions; one for audio one for video. +You start them with: + +rtp_session_t* rtp_init_session ( int _max_users, int _multi_session ); + +Params: +int _max_users - max users. -1 if undefined +int _multi_session - any positive number means uses multi session; -1 if not. + +Return value: +rtp_session_t* - pointer to a newly created rtp session handler. + +How to handle rtp session: +Take a look at +void* phone_handle_media_transport_poll ( void* _hmtc_args_p ) in phone.c +on example. Basically what you do is just receive a message via: + +struct rtp_msg_s* rtp_recv_msg ( rtp_session_t* _session ); + +and then you use payload within the rtp_msg_s struct. Don't forget to deallocate it with: +void rtp_free_msg ( rtp_session_t* _session, struct rtp_msg_s* _msg ); +Receiving should be thread safe so don't worry about that. + +When you capture and encode a payload you want to send it ( obviously ). + +first create a new message with: +struct rtp_msg_s* rtp_msg_new ( rtp_session_t* _session, const uint8_t* _data, uint32_t _length ); + +and then send it with: +int rtp_send_msg ( rtp_session_t* _session, struct rtp_msg_s* _msg, void* _core_handler ); + +_core_handler is the same network handler as in msi_session_s struct. + + + +A/V initialization: + +int init_receive_audio(codec_state *cs); +int init_receive_video(codec_state *cs); +Initialises the A/V decoders. On failure it will print the reason and return 0. On success it will return 1. + +int init_send_audio(codec_state *cs); +int init_send_video(codec_state *cs); +Initialises the A/V encoders. On failure it will print the reason and return 0. On success it will return 1. +init_send_audio will also let the user select an input device. init_send_video will determine the webcam's output codec and initialise the appropriate decoder. + +int video_encoder_refresh(codec_state *cs, int bps); +Reinitialises the video encoder with a new bitrate. ffmpeg does not expose the needed VP8 feature to change the bitrate on the fly, so this serves as a workaround. +In the future, VP8 should be used directly and ffmpeg should be dropped from the dependencies. +The variable bps is the required bitrate in bits per second. + + + +A/V encoding/decoding: + +void *encode_video_thread(void *arg); +Spawns the video encoding thread. The argument should hold a pointer to a codec_state. +This function should only be called if video encoding is supported (when init_send_video returns 1). +Each video frame gets encoded into a packet, which is sent via RTP. Every 60 frames a new bidirectional interframe is encoded. + +void *encode_audio_thread(void *arg); +Spawns the audio encoding thread. The argument should hold a pointer to a codec_state. +This function should only be called if audio encoding is supported (when init_send_audio returns 1). +Audio frames are read from the selected audio capture device during intitialisation. This audio capturing can be rerouted to a different device on the fly. +Each audio frame is encoded into a packet, and sent via RTP. All audio frames have the same amount of samples, which is defined in AV_codec.h. + +int video_decoder_refresh(codec_state *cs, int width, int height); +Sets the SDL window dimensions and creates a pixel buffer with the requested size. It also creates a scaling context, which will be used to convert the input image format to YUV420P. + +void *decode_video_thread(void *arg); +Spawns a video decoding thread. The argument should hold a pointer to a codec_state. The codec_state is assumed to contain a successfully initialised video decoder. +This function reads video packets and feeds them to the video decoder. If the video frame's resolution has changed, video_decoder_refresh() is called. Afterwards, the frame is displayed on the SDL window. + +void *decode_audio_thread(void *arg); +Spawns an audio decoding thread. The argument should hold a pointer to a codec_state. The codec_state is assumed to contain a successfully initialised audio decoder. +All received audio packets are pushed into a jitter buffer and are reordered. If there is a missing packet, or a packet has arrived too late, it is treated as a lost packet and the audio decoder is informed of the packet loss. The audio decoder will then try to reconstruct the lost packet, based on information from previous packets. +Audio is played on the default OpenAL output device. + + +If you have any more qustions/bug reports/feature request contact the following users on the irc channel #tox-dev on irc.freenode.net: +For RTP and MSI: mannol +For audio and video: Martijnvdc \ No newline at end of file diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4 new file mode 100644 index 00000000..6d400ed4 --- /dev/null +++ b/m4/ax_pthread.m4 @@ -0,0 +1,317 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC to any special C compiler that is needed for +# multi-threaded programs (defaults to the value of CC otherwise). (This +# is necessary on AIX to use the special cc_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also link it with them as well. e.g. you should link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threads programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name +# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the +# PTHREAD_PRIO_INHERIT symbol is defined when compiling with +# PTHREAD_CFLAGS. +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# Updated for Autoconf 2.68 by Daniel Richard G. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2011 Daniel Richard G. +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 20 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_PUSH([C]) +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) + AC_MSG_RESULT($ax_pthread_ok) + if test x"$ax_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case ${host_os} in + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + ;; + + darwin*) + ax_pthread_flags="-pthread $ax_pthread_flags" + ;; +esac + +if test x"$ax_pthread_ok" = xno; then +for flag in $ax_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) + if test x"$ax_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include + static void routine(void *a) { a = 0; } + static void *start_routine(void *a) { return a; }], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */])], + [ax_pthread_ok=yes], + []) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($ax_pthread_ok) + if test "x$ax_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $attr; return attr /* ; */])], + [attr_name=$attr; break], + []) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case ${host_os} in + aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; + osf* | hpux*) flag="-D_REENTRANT";; + solaris*) + if test "$GCC" = "yes"; then + flag="-D_REENTRANT" + else + flag="-mt -D_REENTRANT" + fi + ;; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], + ax_cv_PTHREAD_PRIO_INHERIT, [ + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[#include ]], [[int i = PTHREAD_PRIO_INHERIT;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) + ]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], + AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.])) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != xyes; then + case $host_os in + aix*) + AS_CASE(["x/$CC"], + [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], + [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$ax_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + ax_pthread_ok=no + $2 +fi +AC_LANG_POP +])dnl AX_PTHREAD diff --git a/testing/misc_tools.c b/testing/misc_tools.c index d05c88f6..efe1a555 100644 --- a/testing/misc_tools.c +++ b/testing/misc_tools.c @@ -46,7 +46,6 @@ unsigned char *hex_string_to_bin(char hex_string[]) return val; } - int cmdline_parsefor_ipv46(int argc, char **argv, uint8_t *ipv6enabled) { int argvoffset = 0, argi; diff --git a/testing/nToxAudio.h b/testing/nToxAudio.h new file mode 100644 index 00000000..19b31f8b --- /dev/null +++ b/testing/nToxAudio.h @@ -0,0 +1,55 @@ +/* nTox.h + * + *Textual frontend for Tox. + * + * Copyright (C) 2013 Tox project All Rights Reserved. + * + * This file is part of Tox. + * + * Tox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Tox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Tox. If not, see . + * + */ + +#ifndef NTOX_H +#define NTOX_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../core/Messenger.h" +#include "../core/network.h" + +#define STRING_LENGTH 256 +#define HISTORY 50 +#define PUB_KEY_BYTES 32 + +void new_lines(char *line); +void line_eval(char *line); +void wrap(char output[STRING_LENGTH], char input[STRING_LENGTH], int line_width) ; +int count_lines(char *string) ; +char *appender(char *str, const char c); +void do_refresh(); + + + + +#endif diff --git a/tools/astylerc b/tools/astylerc index a2f05160..dd738b74 100644 --- a/tools/astylerc +++ b/tools/astylerc @@ -1,11 +1,11 @@ --style=kr ---pad-header ---max-code-length=120 ---convert-tabs ---indent-switches ---pad-oper ---align-pointer=name ---align-reference=name ---preserve-date ---lineend=linux ---break-blocks \ No newline at end of file + --pad-header + --max-code-length=120 + --convert-tabs + --indent-switches + --pad-oper + --align-pointer=name + --align-reference=name + --preserve-date + --lineend=linux + --break-blocks \ No newline at end of file diff --git a/toxcore/Makefile.inc b/toxcore/Makefile.inc index 025f23c8..116a3e29 100644 --- a/toxcore/Makefile.inc +++ b/toxcore/Makefile.inc @@ -1,4 +1,4 @@ -lib_LTLIBRARIES = libtoxcore.la +lib_LTLIBRARIES += libtoxcore.la libtoxcore_la_include_HEADERS = \ ../toxcore/tox.h @@ -34,7 +34,8 @@ libtoxcore_la_CFLAGS = -I$(top_srcdir) \ $(LIBSODIUM_CFLAGS) \ $(NACL_CFLAGS) -libtoxcore_la_LDFLAGS = $(EXTRA_LT_LDFLAGS) \ +libtoxcore_la_LDFLAGS = $(TOXCORE_LT_LDFLAGS) \ + $(EXTRA_LT_LDFLAGS) \ $(LIBSODIUM_LDFLAGS) \ $(NACL_LDFLAGS) \ $(WINSOCK2_LIBS) diff --git a/toxcore/misc_tools.h b/toxcore/misc_tools.h index 448c1cbd..5fd0cb7a 100644 --- a/toxcore/misc_tools.h +++ b/toxcore/misc_tools.h @@ -69,6 +69,63 @@ * TODO: Update wiki. **********************************************************/ +/* Example usage + +This sample program makes a new struct which contains a +character and a tox_list_t. It then prompts a user for +input until he enters q or e. It then adds each character +to the list, and uses a special for loop to print them. +It then removes all the 'z' characters, and prints the list +again. + +//Notice that the data to be put in the list *contains* tox_list_t; +//usually, this is the other way around! +typedef struct tox_string { + char c; + tox_list_t tox_lst; //Notice that tox_lst is *NOT* a pointer. +} tox_string_t; + +int main() +{ + tox_list_t head; + tox_list_new(&head); //initialize head + + //input a new character, until user enters q or e + char c = '\0'; + while (c != 'q' && c != 'e') { + scanf("%c", &c); + tox_string_t* tmp = malloc(sizeof(tox_string_t)); + tmp->c = c; + tox_list_add(&head, &tmp->tox_lst); //add it to the list + } + +TOX_LIST_FOR_EACH() takes a struct tox_list and a name for a temporary pointer to use in the loop. + +TOX_LIST_GET_VALUE() uses magic to return an instance of a structure that contains tox_list_t. +You have to give it a temporary tox_string_t, name of tox_list_t member inside our structure (tox_lst), +and the type of structure to return. + + TOX_LIST_FOR_EACH(head, tmp) + printf("%c", TOX_LIST_GET_VALUE(*tmp, tox_lst, tox_string_t).c); + + TOX_LIST_FOR_EACH(head, tmp) { + if (TOX_LIST_GET_VALUE(*tmp, tox_lst, tox_string_t).c == 'z') { + //If you delete tmp, you have to quit the loop, or it will go on infinitly. + //This will be fixed later on. + tox_list_remove(tmp); + break; + } + } + + printf("\n"); + TOX_LIST_FOR_EACH(head, tmp) + printf("%c", TOX_LIST_GET_VALUE(*tmp, tox_lst, tox_string_t).c); + + + return 0; +} +*/ + #define MEMBER_OFFSET(var_name_in_parent, parent_type) \ (&(((parent_type*)0)->var_name_in_parent)) diff --git a/toxcore/network.c b/toxcore/network.c index 38adc179..5d695b81 100644 --- a/toxcore/network.c +++ b/toxcore/network.c @@ -227,7 +227,7 @@ int sendpacket(Networking_Core *net, IP_Port ip_port, uint8_t *data, uint32_t le * Packet length is put into length. * Dump all empty packets. */ -static int receivepacket(sock_t sock, IP_Port *ip_port, uint8_t *data, uint32_t *length) +int receivepacket(sock_t sock, IP_Port *ip_port, uint8_t *data, uint32_t *length) { struct sockaddr_storage addr; #ifdef WIN32 @@ -667,6 +667,7 @@ void kill_networking(Networking_Core *net) return; } + /* ip_equal * compares two IPAny structures * unset means unequal diff --git a/toxcore/network.h b/toxcore/network.h index 8a0e20dc..0ce1f34d 100644 --- a/toxcore/network.h +++ b/toxcore/network.h @@ -285,4 +285,6 @@ Networking_Core *new_networking(IP ip, uint16_t port); /* Function to cleanup networking stuff (doesn't do much right now). */ void kill_networking(Networking_Core *net); +int receivepacket(sock_t sock, IP_Port *ip_port, uint8_t *data, uint32_t *length); + #endif diff --git a/toxcore/util.c b/toxcore/util.c index e307bad6..8fc6806e 100644 --- a/toxcore/util.c +++ b/toxcore/util.c @@ -25,7 +25,7 @@ uint64_t random_64b() { uint64_t r; - // This is probably not random enough? + /* This is probably not random enough? */ r = random_int(); r <<= 32; r |= random_int();