source: roaraudio/libroarpulse/simple.c @ 3389:62404943863d

Last change on this file since 3389:62404943863d was 3389:62404943863d, checked in by phi, 14 years ago

use roar_pa_find_server()

File size: 5.2 KB
RevLine 
[398]1//simple.c:
2
[706]3/*
[3385]4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2008-2010
[706]5 *  The code (may) include prototypes and comments (and maybe
6 *  other code fragements) from libpulse*. They are mostly copyrighted by:
7 *  Lennart Poettering <poettering@users.sourceforge.net> and
8 *  Pierre Ossman <drzeus@drzeus.cx>
9 *
10 *  This file is part of libroarpulse a part of RoarAudio,
11 *  a cross-platform sound system for both, home and professional use.
12 *  See README for details.
13 *
14 *  This file is free software; you can redistribute it and/or modify
15 *  it under the terms of the GNU General Public License version 3
16 *  as published by the Free Software Foundation.
17 *
18 *  RoarAudio is distributed in the hope that it will be useful,
19 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 *  GNU General Public License for more details.
22 *
23 *  You should have received a copy of the GNU General Public License
24 *  along with this software; see the file COPYING.  If not, write to
25 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
26 *
27 *  NOTE for everyone want's to change something and send patches:
28 *  read README and HACKING! There a addition information on
29 *  the license of this document you need to read before you send
30 *  any patches.
31 *
32 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
33 *  or libpulse*:
34 *  The libs libroaresd, libroararts and libroarpulse link this libroar
35 *  and are therefore GPL. Because of this it may be illigal to use
36 *  them with any software that uses libesd, libartsc or libpulse*.
37 */
38
[398]39#include <libroarpulse/libroarpulse.h>
40
[402]41/** Create a new connection to the server */
42pa_simple* pa_simple_new(
43    const char *server,                 /**< Server name, or NULL for default */
44    const char *name,                   /**< A descriptive name for this client (application name, ...) */
45    pa_stream_direction_t dir,          /**< Open this stream for recording or playback? */
46    const char *dev,                    /**< Sink (resp. source) name, or NULL for default */
47    const char *stream_name,            /**< A descriptive name for this client (application name, song title, ...) */
48    const pa_sample_spec *ss,           /**< The sample type to use */
49    const pa_channel_map *map,          /**< The channel map to use, or NULL for default */
50    const pa_buffer_attr *attr,         /**< Buffering attributes, or NULL for default */
51    int *error                          /**< A pointer where the error code is stored when the routine returns NULL. It is OK to pass NULL here. */
52    ) {
[3386]53 struct roarpulse_simple * s = roar_mm_malloc(sizeof(struct roarpulse_simple));
[3384]54 struct roar_audio_info info;
[416]55 int roar_dir;
56 struct roar_meta meta;
[406]57
58 if ( !s )
59  return NULL;
60
61 if ( dir == PA_STREAM_PLAYBACK ) {
[416]62  roar_dir = ROAR_DIR_PLAY;
[406]63 } else if ( dir == PA_STREAM_RECORD ) {
[416]64  roar_dir = ROAR_DIR_RECORD;
[406]65 } else {
[3386]66  roar_mm_free(s);
[406]67  return NULL;
68 }
69
[3384]70 if ( roar_pa_sspec2auinfo(&info, ss) == -1 ) {
[3386]71  roar_mm_free(s);
[3384]72  return NULL;
73 }
[410]74
[3389]75 server = roar_pa_find_server((char*)server);
[418]76
[416]77 if ( roar_simple_connect(&(s->con), (char*)server, (char*)name) == -1 ) {
[3386]78  roar_mm_free(s);
[416]79  return NULL;
80 }
81
[3385]82 if ( roar_vio_simple_new_stream_obj(&(s->vio), &(s->con), &(s->stream),
83                                     info.rate, info.channels,
84                                     info.bits, info.codec, roar_dir) == -1 ) {
[416]85  roar_disconnect(&(s->con));
[3386]86  roar_mm_free(s);
[416]87  return NULL;
88 }
89
[418]90 if ( stream_name && stream_name[0] != 0 ) {
91  meta.value  = (char*)stream_name;
92  meta.key[0] = 0;
93  meta.type   = ROAR_META_TYPE_DESCRIPTION;
[416]94
[418]95  roar_stream_meta_set(&(s->con), &(s->stream), ROAR_META_MODE_SET, &meta);
96 }
[406]97
98 return (pa_simple*) s;
[402]99}
100
101/** Close and free the connection to the server. The connection objects becomes invalid when this is called. */
102void pa_simple_free(pa_simple *s) {
[404]103 struct roarpulse_simple * ss = (struct roarpulse_simple*) s;
104 if ( !s )
105  return;
106
[3385]107 roar_vio_close(&(ss->vio));
[416]108 roar_disconnect(&(ss->con));
[405]109
[3386]110 roar_mm_free(s);
[402]111}
112
113/** Write some data to the server */
114int pa_simple_write(pa_simple *s, const void*data, size_t length, int *error) {
[404]115 struct roarpulse_simple * ss = (struct roarpulse_simple*) s;
116 if ( !s )
117  return -1;
118
[3385]119 return roar_vio_write(&(ss->vio), (char*) data, length);
[402]120}
121
122/** Wait until all data already written is played by the daemon */
123int pa_simple_drain(pa_simple *s, int *error) {
[405]124// struct roarpulse_simple * ss = (struct roarpulse_simple*) s;
[404]125 if ( !s )
126  return -1;
127
[405]128 pa_simple_flush(s, NULL);
129
[402]130 return -1;
131}
132
133/** Read some data from the server */
134int pa_simple_read(pa_simple *s, void*data, size_t length, int *error) {
[404]135 struct roarpulse_simple * ss = (struct roarpulse_simple*) s;
136 if ( !s )
137  return -1;
138
[3385]139 return roar_vio_read(&(ss->vio), data, length);
[402]140}
141
142/** Return the playback latency. \since 0.5 */
143pa_usec_t pa_simple_get_latency(pa_simple *s, int *error) {
[404]144 struct roarpulse_simple * ss = (struct roarpulse_simple*) s;
145 if ( !s )
146  return -1;
147
[402]148 return -1;
149}
150
151/** Flush the playback buffer. \since 0.5 */
152int pa_simple_flush(pa_simple *s, int *error) {
[404]153 struct roarpulse_simple * ss = (struct roarpulse_simple*) s;
154 if ( !s )
155  return -1;
156
[2826]157#ifdef ROAR_FDATASYNC
[3385]158 return roar_vio_sync(&(ss->vio));
[2826]159#else
160 return 0;
161#endif
[402]162}
163
[398]164//ll
Note: See TracBrowser for help on using the repository browser.