Changeset 4960:60cdebcb83ef in roaraudio for libroarpulse/simple.c
- Timestamp:
- 05/14/11 04:46:29 (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroarpulse/simple.c
r4708 r4960 40 40 #include <libroarpulse/libroarpulse.h> 41 41 42 #define _seterr() if ( error != NULL ) { *error = roar_pa_raerror2paerror(err); } 43 42 44 /** Create a new connection to the server */ 43 45 pa_simple* pa_simple_new( … … 52 54 int *error /**< A pointer where the error code is stored when the routine returns NULL. It is OK to pass NULL here. */ 53 55 ) { 54 struct roarpulse_simple * s; 56 struct roar_keyval kv[1]; 57 roar_vs_t * vss = NULL; 55 58 struct roar_audio_info info; 56 59 int roar_dir; 57 struct roar_meta meta;60 int err = ROAR_ERROR_NONE; 58 61 59 62 if ( dir == PA_STREAM_PLAYBACK ) { … … 69 72 } 70 73 71 if ( (s = roar_mm_malloc(sizeof(struct roarpulse_simple))) == NULL )72 return NULL;73 74 74 server = roar_pa_find_server((char*)server); 75 75 76 if ( roar_simple_connect(&(s->con), (char*)server, (char*)name) == -1 ) { 77 roar_mm_free(s); 76 vss = roar_vs_new(server, name, &err); 77 if ( vss == NULL ) { 78 _seterr(); 78 79 return NULL; 79 80 } 80 81 81 if ( roar_vio_simple_new_stream_obj(&(s->vio), &(s->con), &(s->stream), 82 info.rate, info.channels, 83 info.bits, info.codec, roar_dir) == -1 ) { 84 roar_disconnect(&(s->con)); 85 roar_mm_free(s); 82 if ( roar_vs_stream(vss, &info, roar_dir, &err) == -1 ) { 83 roar_vs_close(vss, ROAR_VS_TRUE, NULL); 84 _seterr(); 86 85 return NULL; 87 86 } 88 87 89 88 if ( stream_name != NULL && stream_name[0] != 0 ) { 90 meta.value = (char*)stream_name; 91 meta.key[0] = 0; 92 meta.type = ROAR_META_TYPE_DESCRIPTION; 89 kv[0].key = "DESCRIPTION"; 90 kv[1].value = (char*)stream_name; 93 91 94 roar_ stream_meta_set(&(s->con), &(s->stream), ROAR_META_MODE_SET, &meta);92 roar_vs_meta(vss, kv, 1, NULL); 95 93 } 96 94 97 return (pa_simple*) s;95 return (pa_simple*) vss; 98 96 } 99 97 100 98 /** Close and free the connection to the server. The connection objects becomes invalid when this is called. */ 101 99 void pa_simple_free(pa_simple *s) { 102 struct roarpulse_simple * ss = (struct roarpulse_simple*) s;103 104 100 if ( s == NULL ) 105 101 return; 106 102 107 roar_vio_close(&(ss->vio)); 108 roar_disconnect(&(ss->con)); 109 110 roar_mm_free(s); 103 roar_vs_close((roar_vs_t*)s, ROAR_VS_FALSE, NULL); 111 104 } 112 105 113 106 /** Write some data to the server */ 114 107 int pa_simple_write(pa_simple *s, const void*data, size_t length, int *error) { 115 struct roarpulse_simple * ss = (struct roarpulse_simple*) s; 108 int ret; 109 int err = ROAR_ERROR_NONE; 116 110 117 111 if ( s == NULL ) 118 112 return -1; 119 113 120 return roar_vio_write(&(ss->vio), (char*) data, length); 114 ret = roar_vs_write((roar_vs_t*)s, data, length, &err); 115 116 _seterr(); 117 118 return ret; 121 119 } 122 120 123 121 /** Wait until all data already written is played by the daemon */ 124 122 int pa_simple_drain(pa_simple *s, int *error) { 125 // struct roarpulse_simple * ss = (struct roarpulse_simple*) s; 123 int ret; 124 int err = ROAR_ERROR_NONE; 126 125 127 126 if ( s == NULL ) 128 127 return -1; 129 128 130 pa_simple_flush(s, error);129 ret = roar_vs_sync((roar_vs_t*)s, ROAR_VS_WAIT, &err); 131 130 132 return -1; 131 _seterr(); 132 133 return ret; 133 134 } 134 135 135 136 /** Read some data from the server */ 136 137 int pa_simple_read(pa_simple *s, void*data, size_t length, int *error) { 137 struct roarpulse_simple * ss = (struct roarpulse_simple*) s; 138 int ret; 139 int err = ROAR_ERROR_NONE; 138 140 139 141 if ( s == NULL ) 140 142 return -1; 141 143 142 return roar_vio_read(&(ss->vio), data, length); 144 ret = roar_vs_read((roar_vs_t*)s, data, length, &err); 145 146 _seterr(); 147 148 return ret; 143 149 } 144 150 145 151 /** Return the playback latency. \since 0.5 */ 146 152 pa_usec_t pa_simple_get_latency(pa_simple *s, int *error) { 147 struct roarpulse_simple * ss = (struct roarpulse_simple*) s; 153 roar_mus_t ret; 154 int err = ROAR_ERROR_NONE; 148 155 149 156 if ( s == NULL ) 150 157 return -1; 151 158 152 return -1; 159 ret = roar_vs_latency((roar_vs_t*)s, ROAR_VS_BACKEND_DEFAULT, &err); 160 161 if ( ret < 0 ) 162 ret *= -1; 163 164 if ( ret == 0 && err != ROAR_ERROR_NONE ) { 165 _seterr(); 166 return -1; 167 } 168 169 return ret; 153 170 } 154 171 155 172 /** Flush the playback buffer. \since 0.5 */ 156 173 int pa_simple_flush(pa_simple *s, int *error) { 157 struct roarpulse_simple * ss = (struct roarpulse_simple*) s; 174 int ret; 175 int err = ROAR_ERROR_NONE; 158 176 159 177 if ( s == NULL ) 160 178 return -1; 161 179 162 return roar_vio_sync(&(ss->vio)); 180 ret = roar_vs_sync((roar_vs_t*)s, ROAR_VS_NOWAIT, &err); 181 182 _seterr(); 183 184 return ret; 163 185 } 164 186
Note: See TracChangeset
for help on using the changeset viewer.