gnunet

Main GNUnet Logic
Log | Files | Refs | Submodules | README | LICENSE

commit e4d1ce975f6bbb5c89904ad9c174f1e29b49a76b
parent e4eafbbef9d494182ca863f7ee03095a235bdf71
Author: Christian Grothoff <christian@grothoff.org>
Date:   Wed,  2 Oct 2013 19:48:12 +0000

-implement speaker library

Diffstat:
Msrc/conversation/Makefile.am | 10++++++++++
Msrc/conversation/microphone.c | 3++-
Asrc/conversation/speaker.c | 190+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/include/gnunet_speaker_lib.h | 10++++++----
4 files changed, 208 insertions(+), 5 deletions(-)

diff --git a/src/conversation/Makefile.am b/src/conversation/Makefile.am @@ -16,6 +16,7 @@ AM_CPPFLAGS = \ lib_LTLIBRARIES = \ libgnunetmicrophone.la \ + libgnunetspeaker.la \ libgnunetconversation.la pkgcfgdir= $(prefix)/share/gnunet/config.d/ @@ -30,12 +31,21 @@ libgnunetmicrophone_la_LDFLAGS = \ $(GNUNET_LDFLAGS) $(WINFLAGS) \ -version-info 0:0:0 +libgnunetspeaker_la_SOURCES = \ + speaker.c +libgnunetspeaker_la_LIBADD = \ + -lgnunetutil +libgnunetspeaker_la_LDFLAGS = \ + $(GNUNET_LDFLAGS) $(WINFLAGS) \ + -version-info 0:0:0 + libgnunetconversation_la_SOURCES = \ conversation_api.c \ conversation_api2.c libgnunetconversation_la_LIBADD = \ libgnunetmicrophone.la \ + libgnunetspeaker.la \ $(top_builddir)/src/gns/libgnunetgns.la \ $(top_builddir)/src/namestore/libgnunetnamestore.la \ $(top_builddir)/src/util/libgnunetutil.la diff --git a/src/conversation/microphone.c b/src/conversation/microphone.c @@ -101,11 +101,12 @@ enable (void *cls, void *rdc_cls) { struct Microphone *mic = cls; - char * const record_helper_argv[] = + static char * const record_helper_argv[] = { "gnunet-helper-audio-record", NULL }; + mic->rdc = rdc; mic->rdc_cls = rdc_cls; mic->record_helper = GNUNET_HELPER_start (GNUNET_NO, diff --git a/src/conversation/speaker.c b/src/conversation/speaker.c @@ -0,0 +1,190 @@ +/* + This file is part of GNUnet + (C) 2013 Christian Grothoff (and other contributing authors) + + GNUnet 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, or (at your + option) any later version. + + GNUnet 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 GNUnet; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + */ + +/** + * @file conversation/speaker.c + * @brief API to access an audio speaker; provides access to hardware speakers + * @author Simon Dieterle + * @author Andreas Fuchs + * @author Christian Grothoff + */ +#include "platform.h" +#include "gnunet_speaker_lib.h" +#include "conversation.h" + + +/** + * Internal data structures for the speaker. + */ +struct Speaker +{ + /** + * Our configuration. + */ + const struct GNUNET_CONFIGURATION_Handle *cfg; + + /** + * Handle for the playback helper + */ + struct GNUNET_HELPER_Handle *playback_helper; + +}; + + +/** + * Function that enables a speaker. + * + * @param cls closure with the `struct Speaker` + * @return #GNUNET_OK on success, #GNUNET_SYSERR on error + */ +static int +enable (void *cls) +{ + struct Speaker *spe = cls; + static char *playback_helper_argv[] = + { + "gnunet-helper-audio-playback", + NULL + }; + + spe->playback_helper = GNUNET_HELPER_start (GNUNET_NO, + "gnunet-helper-audio-playback", + playback_helper_argv, + NULL, + NULL, spe); + if (NULL == spe->playback_helper) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Could not start playback audio helper.\n")); + return GNUNET_SYSERR; + } + return GNUNET_OK; +} + + +/** + * Function that disables a speaker. + * + * @param cls closure with the `struct Speaker` + */ +static void +disable (void *cls) +{ + struct Speaker *spe = cls; + + if (NULL == spe->playback_helper) + { + GNUNET_break (0); + return; + } + GNUNET_break (GNUNET_OK == + GNUNET_HELPER_kill (spe->playback_helper, GNUNET_NO)); + GNUNET_HELPER_destroy (spe->playback_helper); + spe->playback_helper = NULL; +} + + +/** + * Function to destroy a speaker. + * + * @param cls closure with the `struct Speaker` + */ +static void +destroy (void *cls) +{ + struct Speaker *spe = cls; + + if (NULL != spe->playback_helper) + disable (spe); +} + + +/** + * Function to cause a speaker to play audio data. + * + * @param cls clsoure with the `struct Speaker` + * @param data_size number of bytes in @a data + * @param data audio data to play, format is + * opaque to the API but should be OPUS. + */ +static void +play (void *cls, + size_t data_size, + const void *data) +{ + struct Speaker *spe = cls; + const struct AudioMessage *am; + + if (NULL == spe->playback_helper) + { + GNUNET_break (0); + return; + } + if (sizeof (struct AudioMessage) != data_size) + { + GNUNET_break (0); + return; + } + am = (const struct AudioMessage *) data; + (void) GNUNET_HELPER_send (spe->playback_helper, + &am->header, + GNUNET_YES, + NULL, NULL); +} + + +/** + * Create a speaker that corresponds to the speaker hardware + * of our system. + * + * @param cfg configuration to use + * @return NULL on error + */ +struct GNUNET_SPEAKER_Handle * +GNUNET_SPEAKER_create_from_hardware (const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + struct GNUNET_SPEAKER_Handle *speaker; + struct Speaker *spe; + + spe = GNUNET_new (struct Speaker); + spe->cfg = cfg; + speaker = GNUNET_new (struct GNUNET_SPEAKER_Handle); + speaker->cls = spe; + speaker->enable_speaker = &enable; + speaker->play = &play; + speaker->disable_speaker = &disable; + speaker->destroy_speaker = &destroy; + return speaker; +} + + +/** + * Destroy a speaker. + * + * @param speaker speaker to destroy + */ +void +GNUNET_SPEAKER_destroy (struct GNUNET_SPEAKER_Handle *speaker) +{ + speaker->destroy_speaker (speaker->cls); + GNUNET_free (speaker); +} + +/* end of speaker.c */ diff --git a/src/include/gnunet_speaker_lib.h b/src/include/gnunet_speaker_lib.h @@ -36,10 +36,12 @@ extern "C" #endif #endif +#include "gnunet_util_lib.h" + /** * Function that enables a speaker. * - * @param cls clsoure + * @param cls closure * @return #GNUNET_OK on success, #GNUNET_SYSERR on error */ typedef int (*GNUNET_SPEAKER_EnableCallback)(void *cls); @@ -47,21 +49,21 @@ typedef int (*GNUNET_SPEAKER_EnableCallback)(void *cls); /** * Function that disables a speaker. * - * @param cls clsoure + * @param cls closure */ typedef void (*GNUNET_SPEAKER_DisableCallback)(void *cls); /** * Function to destroy a speaker. * - * @param cls clsoure + * @param cls closure */ typedef void (*GNUNET_SPEAKER_DestroyCallback)(void *cls); /** * Function to cause a speaker to play audio data. * - * @param cls clsoure + * @param cls closure * @param data_size number of bytes in @a data * @param data audio data to play, format is * opaque to the API but should be OPUS.