we now load module-xrdp-sink/source automatically so user's dont have to mess around with configuring /etc/pulse/default.pa config file
This commit is contained in:
parent
43b7b84182
commit
82b7ccae96
15
configure.ac
15
configure.ac
@ -43,14 +43,22 @@ AC_ARG_ENABLE(tjpeg, AS_HELP_STRING([--enable-tjpeg],
|
||||
[Build turbo jpeg module(assumes /opt/libjpeg-turbo) (default: no)]),
|
||||
[tjpeg=true], [tjpeg=false])
|
||||
AM_CONDITIONAL(XRDP_TJPEG, [test x$tjpeg = xtrue])
|
||||
|
||||
AC_ARG_ENABLE(simplesound, AS_HELP_STRING([--enable-simplesound],
|
||||
[Build simple pulse audio interface (default: no)]),
|
||||
[simplesound=true], [simplesound=false])
|
||||
AM_CONDITIONAL(XRDP_SIMPLESOUND, [test x$simplesound = xtrue])
|
||||
|
||||
AC_ARG_ENABLE(fuse, AS_HELP_STRING([--enable-fuse],
|
||||
[Build fuse(clipboard file / drive redir) (default: no)]),
|
||||
[fuse=true], [fuse=false])
|
||||
AM_CONDITIONAL(XRDP_FUSE, [test x$fuse = xtrue])
|
||||
|
||||
AC_ARG_ENABLE(load_pulse_modules, AS_HELP_STRING([--enable-load_pulse_modules],
|
||||
[Build code to load pulse audio modules (default: no)]),
|
||||
[load_pulse_modules=true], [load_pulse_modules=false])
|
||||
AM_CONDITIONAL(XRDP_LOAD_PULSE_MODULES, [test x$load_pulse_modules = xtrue])
|
||||
|
||||
AC_ARG_ENABLE(xrdpvr, AS_HELP_STRING([--enable-xrdpvr],
|
||||
[Build xrdpvr module (default: no)]),
|
||||
[xrdpvr=true], [xrdpvr=false])
|
||||
@ -105,6 +113,13 @@ then
|
||||
[#define _FILE_OFFSET_BITS 64])
|
||||
fi
|
||||
|
||||
# checking for libpulse
|
||||
if ! test -z "$enable_load_pulse_modules"
|
||||
then
|
||||
AC_CHECK_HEADER([pulse/util.h], [],
|
||||
[AC_MSG_ERROR([please install libpulse-dev or libpulse-devel])])
|
||||
fi
|
||||
|
||||
# checking for libpulse libpulse-simple
|
||||
if ! test -z "$enable_simplesound"
|
||||
then
|
||||
|
@ -26,6 +26,11 @@ EXTRA_DEFINES += -DXRDP_FUSE
|
||||
EXTRA_LIBS += -lfuse
|
||||
endif
|
||||
|
||||
if XRDP_LOAD_PULSE_MODULES
|
||||
EXTRA_DEFINES += -DXRDP_LOAD_PULSE_MODULES
|
||||
EXTRA_LIBS += -lpulse
|
||||
endif
|
||||
|
||||
AM_CFLAGS = \
|
||||
-DXRDP_CFG_PATH=\"${sysconfdir}/xrdp\" \
|
||||
-DXRDP_SBIN_PATH=\"${sbindir}\" \
|
||||
|
@ -72,7 +72,7 @@ PA_MODULE_USAGE(
|
||||
"channels=<number of channels> "
|
||||
"channel_map=<channel map>");
|
||||
|
||||
#define DEFAULT_SINK_NAME "xrdp"
|
||||
#define DEFAULT_SINK_NAME "xrdp-sink"
|
||||
#define BLOCK_USEC 30000
|
||||
//#define BLOCK_USEC (PA_USEC_PER_SEC * 2)
|
||||
#define CHANSRV_PORT_STR "/tmp/.xrdp/xrdp_chansrv_audio_out_socket_%d"
|
||||
|
@ -60,7 +60,7 @@ PA_MODULE_USAGE(
|
||||
"description=<description for the source> "
|
||||
"latency_time=<latency time in ms>");
|
||||
|
||||
#define DEFAULT_SOURCE_NAME "xrdp"
|
||||
#define DEFAULT_SOURCE_NAME "xrdp-source"
|
||||
#define DEFAULT_LATENCY_TIME 10
|
||||
#define MAX_LATENCY_USEC (PA_USEC_PER_SEC * 2)
|
||||
#define CHANSRV_PORT_STR "/tmp/.xrdp/xrdp_chansrv_audio_in_socket_%d"
|
||||
|
@ -1,4 +1,8 @@
|
||||
|
||||
--------------------------------------
|
||||
Building pulseaudio modules for xrdp
|
||||
--------------------------------------
|
||||
|
||||
o append the following line to /etc/apt/sources.list
|
||||
|
||||
deb-src http://archive.ubuntu.com/ubuntu/ precise-updates main restricted universe multiverse
|
||||
@ -45,31 +49,16 @@ o sudo cp module-xrdp-sink.so /usr/lib/pulse-<version>/modules
|
||||
sudo cp module-xrdp-source.so /usr/lib/pulse-<version>/modules
|
||||
note: on a 64bit machine use lib64 instead of lib
|
||||
|
||||
o cd /etc/pulse
|
||||
--------------------------------------
|
||||
To test sound/microphone redirection
|
||||
--------------------------------------
|
||||
|
||||
o sudo mv default.pa default.pa.orig
|
||||
|
||||
o sudo vi default.pa and add the following lines to it
|
||||
|
||||
.nofail
|
||||
.fail
|
||||
load-module module-augment-properties
|
||||
#load-module module-alsa-sink device=hw:0
|
||||
#load-module module-alsa-source device=hw:0
|
||||
#load-module module-pipe-sink
|
||||
#load-module module-pipe-source
|
||||
#load-module module-null-sink
|
||||
load-module module-xrdp-sink
|
||||
load-module module-xrdp-source
|
||||
load-module module-native-protocol-unix
|
||||
#load-module module-udev-detect tsched=0
|
||||
|
||||
o sudo apt-get install pavucontrol
|
||||
|
||||
o pulseaudio --kill
|
||||
o install gnome sound recorder or your favorite sound recorder
|
||||
|
||||
o mplayer -ao pulse <audio file>
|
||||
|
||||
o sudo apt-get install pavucontrol
|
||||
|
||||
o in another window run pavucontrol and you should see xrdp-sink in use
|
||||
|
||||
o to enable pulseaudio log
|
||||
|
@ -16,6 +16,14 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <pulse/util.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/errno.h>
|
||||
#include <signal.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
#include "sound.h"
|
||||
#include "thread_calls.h"
|
||||
#include "defines.h"
|
||||
@ -626,6 +634,12 @@ sound_init(void)
|
||||
|
||||
LOG(0, ("sound_init:"));
|
||||
|
||||
|
||||
#ifdef XRDP_LOAD_PULSE_MODULES
|
||||
if (load_pulse_modules())
|
||||
LOG(0, ("Audio and microphone redirection will not work!"));
|
||||
#endif
|
||||
|
||||
/* init sound output */
|
||||
sound_send_server_output_formats();
|
||||
|
||||
@ -691,6 +705,10 @@ sound_deinit(void)
|
||||
|
||||
fifo_deinit(&in_fifo);
|
||||
|
||||
#ifdef XRDP_LOAD_PULSE_MODULES
|
||||
system("pulseaudio --kill");
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -802,6 +820,158 @@ sound_check_wait_objs(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load xrdp pulseaudio sink and source modules
|
||||
*
|
||||
* @return 0 on success, -1 on failure
|
||||
*****************************************************************************/
|
||||
|
||||
#ifdef XRDP_LOAD_PULSE_MODULES
|
||||
|
||||
static int APP_CC
|
||||
load_pulse_modules()
|
||||
{
|
||||
struct sockaddr_un sa;
|
||||
|
||||
pid_t pid;
|
||||
char* cli;
|
||||
int fd;
|
||||
int i;
|
||||
int rv;
|
||||
char buf[1024];
|
||||
|
||||
/* is pulse audio daemon running? */
|
||||
if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: No PulseAudio daemon running, "
|
||||
"or not running as session daemon"));
|
||||
}
|
||||
|
||||
/* get name of unix domain socket used by pulseaudio for CLI */
|
||||
if ((cli = (char *) pa_runtime_path("cli")) == NULL)
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: Error getting PulesAudio runtime path"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* open a socket */
|
||||
if ((fd = socket(PF_LOCAL, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
pa_xfree(cli);
|
||||
LOG(0, ("load_pulse_modules: Socket open error"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* set it up */
|
||||
memset(&sa, 0, sizeof(struct sockaddr_un));
|
||||
sa.sun_family = AF_UNIX;
|
||||
pa_strlcpy(sa.sun_path, cli, sizeof(sa.sun_path));
|
||||
pa_xfree(cli);
|
||||
|
||||
for (i = 0; i < 20; i++)
|
||||
{
|
||||
if (pa_pid_file_kill(SIGUSR2, NULL, "pulseaudio") < 0)
|
||||
LOG(0, ("load_pulse_modules: Failed to kill PulseAudio daemon"));
|
||||
|
||||
if ((rv = connect(fd, (struct sockaddr*) &sa, sizeof(sa))) < 0 &&
|
||||
(errno != ECONNREFUSED && errno != ENOENT))
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: connect() failed with error: %s",
|
||||
strerror(errno)));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rv >= 0)
|
||||
break;
|
||||
|
||||
pa_msleep(300);
|
||||
}
|
||||
|
||||
if (i >= 20)
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: Daemon not responding"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
LOG(0, ("load_pulse_modules: connected to pulseaudio daemon"));
|
||||
|
||||
/* read back PulseAudio sign on message */
|
||||
memset(buf, 0, 1024);
|
||||
recv(fd, buf, 1024, 0);
|
||||
|
||||
/* send cmd to load source module */
|
||||
memset(buf, 0, 1024);
|
||||
sprintf(buf, "load-module module-xrdp-source\n");
|
||||
send(fd, buf, strlen(buf), 0);
|
||||
|
||||
/* read back response */
|
||||
memset(buf, 0, 1024);
|
||||
recv(fd, buf, 1024, 0);
|
||||
if (strcasestr(buf, "Module load failed") != 0)
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: Error loading module-xrdp-source"));
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: Loaded module-xrdp-source"));
|
||||
|
||||
/* success, set it as the default source */
|
||||
memset(buf, 0, 1024);
|
||||
sprintf(buf, "set-default-source xrdp-source\n");
|
||||
send(fd, buf, strlen(buf), 0);
|
||||
|
||||
memset(buf, 0, 1024);
|
||||
recv(fd, buf, 1024, 0);
|
||||
|
||||
if (strcasestr(buf, "does not exist") != 0)
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: Error setting default source"));
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: set default source"));
|
||||
}
|
||||
}
|
||||
|
||||
/* send cmd to load sink module */
|
||||
memset(buf, 0, 1024);
|
||||
sprintf(buf, "load-module module-xrdp-sink\n");
|
||||
send(fd, buf, strlen(buf), 0);
|
||||
|
||||
/* read back response */
|
||||
memset(buf, 0, 1024);
|
||||
recv(fd, buf, 1024, 0);
|
||||
if (strcasestr(buf, "Module load failed") != 0)
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: Error loading module-xrdp-sink"));
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: Loaded module-xrdp-sink"));
|
||||
|
||||
/* success, set it as the default sink */
|
||||
memset(buf, 0, 1024);
|
||||
sprintf(buf, "set-default-sink xrdp-sink\n");
|
||||
send(fd, buf, strlen(buf), 0);
|
||||
|
||||
memset(buf, 0, 1024);
|
||||
recv(fd, buf, 1024, 0);
|
||||
|
||||
if (strcasestr(buf, "does not exist") != 0)
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: Error setting default sink"));
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG(0, ("load_pulse_modules: set default sink"));
|
||||
}
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
** **
|
||||
** Microphone releated code **
|
||||
|
@ -75,4 +75,5 @@ static int APP_CC sound_input_start_recording();
|
||||
static int APP_CC sound_input_stop_recording();
|
||||
static int APP_CC sound_process_input_data(struct stream *s, int bytes);
|
||||
static int DEFAULT_CC sound_sndsrvr_source_data_in(struct trans *trans);
|
||||
static int APP_CC load_pulse_modules();
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user