Changeset 4174:4d5ffa10c7fe in roaraudio


Ignore:
Timestamp:
08/14/10 05:32:31 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added basic code for the vs API

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/vs.c

    r4173 r4174  
    3636#include "libroar.h" 
    3737 
     38#define FLAG_NONE     0x0000 
     39#define FLAG_STREAM   0x0001 
     40 
     41#define _seterr(x) do { if ( error != NULL ) *error = (x); } while(1) 
     42 
     43struct roar_vs { 
     44 int flags; 
     45 struct roar_connection con_store; 
     46 struct roar_connection * con; 
     47 struct roar_stream       stream; 
     48 struct roar_vio_calls    vio; 
     49}; 
     50 
     51const char * roar_vs_strerr(int error) { 
     52 const struct { 
     53  int err; 
     54  const char * msg; 
     55 } msgs[] = { 
     56  {ROAR_ERROR_NONE,    "none"}, 
     57  {ROAR_ERROR_PERM,    "perm"}, 
     58  {ROAR_ERROR_NOENT,   "noent"}, 
     59  {ROAR_ERROR_BADMSG,  "badmsg"}, 
     60  {ROAR_ERROR_BUSY,    "busy"}, 
     61  {ROAR_ERROR_CONNREFUSED, "connrefused"}, 
     62  {ROAR_ERROR_NOSYS,   "nosys"}, 
     63  {ROAR_ERROR_NOTSUP,  "notsup"}, 
     64  {ROAR_ERROR_PIPE,    "pipe"}, 
     65  {ROAR_ERROR_PROTO,   "proto"}, 
     66  {ROAR_ERROR_RANGE,   "range"}, 
     67  {ROAR_ERROR_MSGSIZE, "msgsize"}, 
     68  {ROAR_ERROR_NOMEM,   "nomem"}, 
     69  {ROAR_ERROR_INVAL,   "inval"}, 
     70  {-1, NULL} 
     71 }; 
     72 int i; 
     73 
     74 for (i = 0; msgs[i].msg != NULL; i++) 
     75  if ( msgs[i].err == error ) 
     76   return msgs[i].msg; 
     77 
     78 return "(unknown)"; 
     79} 
     80 
     81static roar_vs_t * roar_vs_init(int * error) { 
     82 roar_vs_t * vss = roar_mm_malloc(sizeof(roar_vs_t)); 
     83 
     84 if ( vss == NULL ) { 
     85  _seterr(ROAR_ERROR_NOMEM); 
     86  return NULL; 
     87 } 
     88 
     89 memset(vss, 0, sizeof(roar_vs_t)); 
     90 
     91 return vss; 
     92} 
     93 
     94roar_vs_t * roar_vs_new_from_con(struct roar_connection * con, int * error) { 
     95 roar_vs_t * vss = roar_vs_init(error); 
     96 
     97 if ( vss == NULL ) 
     98  return NULL; 
     99 
     100 vss->con = con; 
     101 
     102 return vss; 
     103} 
     104 
     105roar_vs_t * roar_vs_new(const char * server, const char * name, int * error) { 
     106 roar_vs_t * vss = roar_vs_init(error); 
     107 int ret; 
     108 
     109 if ( vss == NULL ) 
     110  return NULL; 
     111 
     112 vss->con = &(vss->con_store); 
     113 
     114 ret = roar_simple_connect(vss->con, (char*)server, (char*)name); 
     115 
     116 if ( ret == -1 ) { 
     117  roar_vs_close(vss, ROAR_VS_TRUE, NULL); 
     118  _seterr(ROAR_ERROR_UNKNOWN); 
     119  return NULL; 
     120 } 
     121 
     122 return vss; 
     123} 
     124 
     125int roar_vs_stream(roar_vs_t * vss, const struct roar_audio_info * info, int dir, int * error) { 
     126 int ret; 
     127 
     128 if ( vss->flags & FLAG_STREAM ) { 
     129  _seterr(ROAR_ERROR_INVAL); 
     130  return -1; 
     131 } 
     132 
     133 ret = roar_vio_simple_new_stream_obj(&(vss->vio), vss->con, &(vss->stream), 
     134                                      info->rate, info->channels, info->bits, info->codec, 
     135                                      dir 
     136                                     ); 
     137 
     138 if ( ret == -1 ) { 
     139  _seterr(ROAR_ERROR_UNKNOWN); 
     140  return -1; 
     141 } 
     142 
     143 vss->flags |= FLAG_STREAM; 
     144 
     145 return 0; 
     146} 
     147 
     148roar_vs_t * roar_vs_new_simple(const char * server, const char * name, int rate, int channels, int codec, int bits, int dir, int * error) { 
     149 roar_vs_t * vss = roar_vs_new(server, name, error); 
     150 struct roar_audio_info info; 
     151 int ret; 
     152 
     153 if (vss == NULL) 
     154  return NULL; 
     155 
     156 memset(&info, 0, sizeof(info)); 
     157 
     158 info.rate     = rate; 
     159 info.channels = channels; 
     160 info.codec    = codec; 
     161 info.bits     = bits; 
     162 
     163 ret = roar_vs_stream(vss, &info, dir, error); 
     164 
     165 if (ret == -1) { 
     166  roar_vs_close(vss, ROAR_VS_TRUE, NULL); 
     167  return NULL; 
     168 } 
     169 
     170 return vss; 
     171} 
     172 
     173int roar_vs_close(roar_vs_t * vss, int killit, int * error) { 
     174 if ( vss->flags & FLAG_STREAM ) { 
     175  if ( killit ) { 
     176   roar_kick(vss->con, ROAR_OT_STREAM, roar_stream_get_id(&(vss->stream))); 
     177  } 
     178 
     179  roar_vio_close(&(vss->vio)); 
     180 } 
     181 
     182 if ( vss->con == &(vss->con_store) ) { 
     183  roar_disconnect(vss->con); 
     184 } 
     185 
     186 roar_mm_free(vss); 
     187 return 0; 
     188} 
     189 
     190ssize_t roar_vs_write(roar_vs_t * vss, const void * buf, size_t len, int * error) { 
     191 ssize_t ret; 
     192 
     193 if ( !(vss->flags & FLAG_STREAM) ) { 
     194  _seterr(ROAR_ERROR_INVAL); 
     195  return -1; 
     196 } 
     197 
     198 ret = roar_vio_write(&(vss->vio), (void*)buf, len); 
     199 
     200 if ( ret == -1 ) { 
     201  _seterr(ROAR_ERROR_UNKNOWN); 
     202 } 
     203 
     204 return ret; 
     205} 
     206 
     207ssize_t roar_vs_read (roar_vs_t * vss,       void * buf, size_t len, int * error) { 
     208 ssize_t ret; 
     209 
     210 if ( !(vss->flags & FLAG_STREAM) ) { 
     211  _seterr(ROAR_ERROR_INVAL); 
     212  return -1; 
     213 } 
     214 
     215 ret = roar_vio_read(&(vss->vio), buf, len); 
     216 
     217 if ( ret == -1 ) { 
     218  _seterr(ROAR_ERROR_UNKNOWN); 
     219 } 
     220 
     221 return ret; 
     222} 
     223 
     224 
    38225//ll 
Note: See TracChangeset for help on using the changeset viewer.