tox A/V: integration of A/V code into tox

Also-by: Sergey 'Jin' Bostandzhyan <jin@mediatomb.cc>
This commit is contained in:
mannol 2013-10-13 16:17:30 +02:00 committed by BtbN
parent da727875ac
commit 5bc2560904
14 changed files with 748 additions and 20 deletions

View File

@ -19,6 +19,31 @@ before_script:
- ./configure && make -j3 - ./configure && make -j3
- sudo make install - sudo make install
- cd .. - 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 # creating librarys' links and updating cache
- sudo ldconfig - sudo ldconfig
# installing check, needed for unit tests # installing check, needed for unit tests

View File

@ -10,7 +10,7 @@ CLEANFILES = $(top_builddir)/libtoxcore.pc
EXTRA_DIST = \ EXTRA_DIST = \
$(top_srcdir)/libtoxcore.pc.in \ libtoxcore.pc.in \
$(top_srcdir)/docs/updates/Crypto.md \ $(top_srcdir)/docs/updates/Crypto.md \
$(top_srcdir)/docs/updates/Spam-Prevention.md \ $(top_srcdir)/docs/updates/Spam-Prevention.md \
$(top_srcdir)/docs/updates/Symmetric-NAT-Transversal.md \ $(top_srcdir)/docs/updates/Symmetric-NAT-Transversal.md \

View File

@ -1,9 +1,12 @@
bin_PROGRAMS = bin_PROGRAMS =
noinst_PROGRAMS = noinst_PROGRAMS =
lib_LTLIBRARIES =
noinst_bindir = $(top_builddir)/build noinst_bindir = $(top_builddir)/build
EXTRA_DIST= EXTRA_DIST=
include ../toxcore/Makefile.inc include ../toxcore/Makefile.inc
include ../toxrtp/Makefile.inc
include ../toxmsi/Makefile.inc
include ../other/Makefile.inc include ../other/Makefile.inc
include ../testing/Makefile.inc include ../testing/Makefile.inc
include ../other/bootstrap_serverdaemon/Makefile.inc include ../other/bootstrap_serverdaemon/Makefile.inc

View File

@ -10,7 +10,11 @@ AM_INIT_AUTOMAKE([1.10 -Wall subdir-objects])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
EXTRA_LT_LDFLAGS=
LIBTOXCORE_LT_VERSION=0:0:0 LIBTOXCORE_LT_VERSION=0:0:0
LIBTOXMSI_LT_VERSION=0:0:0
LIBTOXRTP_LT_VERSION=0:0:0
dnl dnl
dnl current:revision:age dnl current:revision:age
dnl dnl
@ -19,7 +23,13 @@ dnl revision: increment if source code has changed, set to zero if current is
dnl incremented dnl incremented
dnl age: increment if interfaces have been added, set to zero if dnl age: increment if interfaces have been added, set to zero if
dnl interfaces have been removed or changed 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 if test "x${prefix}" = "xNONE"; then
prefix="${ac_default_prefix}" prefix="${ac_default_prefix}"
@ -28,6 +38,7 @@ fi
BUILD_DHT_BOOTSTRAP_DAEMON="yes" BUILD_DHT_BOOTSTRAP_DAEMON="yes"
BUILD_NTOX="yes" BUILD_NTOX="yes"
BUILD_TESTS="yes" BUILD_TESTS="yes"
BUILD_AV="yes"
BUILD_TESTING="yes" BUILD_TESTING="yes"
NCURSES_FOUND="no" 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_ARG_ENABLE([tests],
[AC_HELP_STRING([--disable-tests], [build unit tests (default: auto)]) ], [AC_HELP_STRING([--disable-tests], [build unit tests (default: auto)]) ],
[ [
@ -314,8 +338,95 @@ AC_TYPE_UINT8_T
AC_FUNC_FORK AC_FUNC_FORK
AC_CHECK_FUNCS([gettimeofday memset socket strchr malloc]) AC_CHECK_FUNCS([gettimeofday memset socket strchr malloc])
# pkg-config based tests if test "x$BUILD_AV" = "xyes"; then
PKG_PROG_PKG_CONFIG 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 -n "$PKG_CONFIG"; then
if test "x$BUILD_TESTS" = "xyes"; then if test "x$BUILD_TESTS" = "xyes"; then
@ -351,7 +462,7 @@ if test -n "$PKG_CONFIG"; then
]) ])
fi fi
else 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 fi
if (test "x$BUILD_NTOX" = "xyes") && (test "x$NCURSES_FOUND" != "xyes"); then 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_DHT_BOOTSTRAP_DAEMON, test "x$BUILD_DHT_BOOTSTRAP_DAEMON" = "xyes")
AM_CONDITIONAL(BUILD_TESTS, test "x$BUILD_TESTS" = "xyes") AM_CONDITIONAL(BUILD_TESTS, test "x$BUILD_TESTS" = "xyes")
AM_CONDITIONAL(BUILD_NTOX, test "x$BUILD_NTOX" = "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") AM_CONDITIONAL(BUILD_TESTING, test "x$BUILD_TESTING" = "xyes")
AC_CONFIG_FILES([Makefile AC_CONFIG_FILES([Makefile

156
docs/av_api.md Normal file
View File

@ -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

317
m4/ax_pthread.m4 Normal file
View File

@ -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 <stevenj@alum.mit.edu>
# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
#
# 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 <http://www.gnu.org/licenses/>.
#
# 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 <pthread.h>
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 <pthread.h>],
[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 <pthread.h>]], [[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

View File

@ -46,7 +46,6 @@ unsigned char *hex_string_to_bin(char hex_string[])
return val; return val;
} }
int cmdline_parsefor_ipv46(int argc, char **argv, uint8_t *ipv6enabled) int cmdline_parsefor_ipv46(int argc, char **argv, uint8_t *ipv6enabled)
{ {
int argvoffset = 0, argi; int argvoffset = 0, argi;

55
testing/nToxAudio.h Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef NTOX_H
#define NTOX_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ncurses.h>
#include <curses.h>
#include <ctype.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netdb.h>
#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

View File

@ -1,11 +1,11 @@
--style=kr --style=kr
--pad-header --pad-header
--max-code-length=120 --max-code-length=120
--convert-tabs --convert-tabs
--indent-switches --indent-switches
--pad-oper --pad-oper
--align-pointer=name --align-pointer=name
--align-reference=name --align-reference=name
--preserve-date --preserve-date
--lineend=linux --lineend=linux
--break-blocks --break-blocks

View File

@ -1,4 +1,4 @@
lib_LTLIBRARIES = libtoxcore.la lib_LTLIBRARIES += libtoxcore.la
libtoxcore_la_include_HEADERS = \ libtoxcore_la_include_HEADERS = \
../toxcore/tox.h ../toxcore/tox.h
@ -34,7 +34,8 @@ libtoxcore_la_CFLAGS = -I$(top_srcdir) \
$(LIBSODIUM_CFLAGS) \ $(LIBSODIUM_CFLAGS) \
$(NACL_CFLAGS) $(NACL_CFLAGS)
libtoxcore_la_LDFLAGS = $(EXTRA_LT_LDFLAGS) \ libtoxcore_la_LDFLAGS = $(TOXCORE_LT_LDFLAGS) \
$(EXTRA_LT_LDFLAGS) \
$(LIBSODIUM_LDFLAGS) \ $(LIBSODIUM_LDFLAGS) \
$(NACL_LDFLAGS) \ $(NACL_LDFLAGS) \
$(WINSOCK2_LIBS) $(WINSOCK2_LIBS)

View File

@ -69,6 +69,63 @@
* TODO: Update wiki. * 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) \ #define MEMBER_OFFSET(var_name_in_parent, parent_type) \
(&(((parent_type*)0)->var_name_in_parent)) (&(((parent_type*)0)->var_name_in_parent))

View File

@ -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. * Packet length is put into length.
* Dump all empty packets. * 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; struct sockaddr_storage addr;
#ifdef WIN32 #ifdef WIN32
@ -667,6 +667,7 @@ void kill_networking(Networking_Core *net)
return; return;
} }
/* ip_equal /* ip_equal
* compares two IPAny structures * compares two IPAny structures
* unset means unequal * unset means unequal

View File

@ -285,4 +285,6 @@ Networking_Core *new_networking(IP ip, uint16_t port);
/* Function to cleanup networking stuff (doesn't do much right now). */ /* Function to cleanup networking stuff (doesn't do much right now). */
void kill_networking(Networking_Core *net); void kill_networking(Networking_Core *net);
int receivepacket(sock_t sock, IP_Port *ip_port, uint8_t *data, uint32_t *length);
#endif #endif

View File

@ -25,7 +25,7 @@ uint64_t random_64b()
{ {
uint64_t r; uint64_t r;
// This is probably not random enough? /* This is probably not random enough? */
r = random_int(); r = random_int();
r <<= 32; r <<= 32;
r |= random_int(); r |= random_int();