Changeset 3465:23962b935804 in roaraudio for libroarpulse


Ignore:
Timestamp:
02/13/10 23:23:36 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

start to support writeout of playback buffer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroarpulse/stream.c

    r3464 r3465  
    5858 pa_timing_info          timinginfo; 
    5959 pa_buffer_attr          bufattr; 
     60 pa_stream_direction_t   dir; 
    6061 struct roar_buffer    * iobuffer; 
    6162 struct { 
     
    118119 ROAR_DBG("pa_stream_new_with_proplist(c=%p, name='%s', ss=%p, map=%p, p=%p) = ?", c, name, ss, map, p); 
    119120 
    120  s->fragments.num  = 4; 
     121 s->fragments.num  = 8; 
    121122 s->fragments.size = 2048; 
    122123 
     
    183184                                  pa_io_event_flags_t   events, 
    184185                                  void                * userdata) { 
     186 pa_stream * s = userdata; 
     187 void * data; 
     188 size_t len; 
     189 size_t ret; 
     190 
     191 ROAR_DBG("_roar_pa_stream_ioecb(*) = ?"); 
     192 
     193 switch (s->dir) { 
     194  case PA_STREAM_PLAYBACK: 
     195    if ( s->iobuffer != NULL ) { 
     196     if ( roar_buffer_get_data(s->iobuffer, &data) == -1 ) 
     197      return; 
     198 
     199     if ( roar_buffer_get_len(s->iobuffer, &len) == -1 ) 
     200      return; 
     201 
     202     if ( (ret = roar_vio_write(&(s->vio), data, len)) == -1 ) 
     203      return; 
     204 
     205     // TODO: handle errors 
     206     if ( ret == len ) { 
     207      roar_buffer_next(&(s->iobuffer)); 
     208     } else { 
     209      roar_buffer_set_offset(s->iobuffer, ret); 
     210     } 
     211    } 
     212 
     213    if ( s->iobuffer == NULL ) { 
     214     ea->io_enable(e, PA_IO_EVENT_HANGUP|PA_IO_EVENT_ERROR); 
     215    } 
     216   break; 
     217  case PA_STREAM_RECORD: 
     218   break; 
     219  default: 
     220   return; 
     221 } 
     222 
    185223 ROAR_DBG("_roar_pa_stream_ioecb(*) = (void)"); 
    186224} 
     
    195233 struct roar_connection * con; 
    196234 pa_mainloop_api * api; 
    197  pa_io_event_flags_t event_flags = PA_IO_EVENT_HANGUP; 
     235 pa_io_event_flags_t event_flags = PA_IO_EVENT_HANGUP|PA_IO_EVENT_ERROR; 
    198236 int fh; 
    199237 int ctl = -1; 
     
    215253  return -1; 
    216254 } 
     255 
     256 s->dir = dir; 
    217257 
    218258 switch (dir) { 
     
    327367        int64_t offset,          /**< Offset for seeking, must be 0 for upload streams */ 
    328368        pa_seek_mode_t seek      /**< Seek mode, must be PA_SEEK_RELATIVE for upload streams */) { 
     369 pa_mainloop_api    * api; 
    329370 struct roar_buffer * buf; 
    330371 void               * bufdata; 
     372 
     373 ROAR_DBG("pa_stream_write(p=%p, data=%p, length=%llu, free_cb=%p, offset=%lli, seek=%i) = ?", p, data, (long long unsigned int) length, free_cb, offset, seek); 
    331374 
    332375 // TODO: implement seeking in output buffer 
     
    374417  if ( roar_buffer_add(p->iobuffer, buf) == -1 ) 
    375418   return -1; 
     419 } 
     420 
     421 if ( p->io_event != NULL ) { 
     422  api = roar_pa_context_get_api(p->c); 
     423  if ( api != NULL ) { 
     424   api->io_enable(p->io_event, PA_IO_EVENT_OUTPUT|PA_IO_EVENT_HANGUP|PA_IO_EVENT_ERROR); 
     425  } 
    376426 } 
    377427 
     
    430480 struct roar_buffer_stats stats; 
    431481 
    432  if ( p == NULL ) 
     482 ROAR_DBG("pa_stream_writable_size(p=%p) = ?", p); 
     483 
     484 if ( p == NULL ) { 
     485  ROAR_DBG("pa_stream_writable_size(p=%p) = 0", p); 
    433486  return 0; 
    434  
    435  if ( p->iobuffer == NULL ) 
     487 } 
     488 
     489 if ( p->iobuffer == NULL ) { 
     490  ROAR_DBG("pa_stream_writable_size(p=%p) = %llu", p, (long long unsigned)(p->fragments.num*p->fragments.size)); 
     491  return p->fragments.num * p->fragments.size / 2; 
     492 } 
     493 
     494 if ( roar_buffer_ring_stats(p->iobuffer, &stats) == -1 ) { 
     495  ROAR_DBG("pa_stream_writable_size(p=%p) = 0", p); 
    436496  return 0; 
    437  
    438  if ( roar_buffer_ring_stats(p->iobuffer, &stats) == -1 ) 
     497 } 
     498 
     499 ROAR_DBG("pa_stream_writable_size(p=%p): stats={.parts=%i, .bytes=%i, ...}", p, stats.parts, stats.bytes); 
     500 
     501 if ( stats.parts > p->fragments.num ) { 
     502  ROAR_DBG("pa_stream_writable_size(p=%p) = 0", p); 
    439503  return 0; 
    440  
    441  if ( stats.parts > p->fragments.num ) 
    442   return 0; 
    443  
     504 } 
     505 
     506 if ( stats.parts > (p->fragments.num/2) ) 
     507  stats.parts = p->fragments.num / 2; 
     508 
     509 ROAR_DBG("pa_stream_writable_size(p=%p) = %llu", p, (long long unsigned)((p->fragments.num - stats.parts)*p->fragments.size)); 
    444510 return (p->fragments.num - stats.parts)*p->fragments.size; 
    445511} 
Note: See TracChangeset for help on using the changeset viewer.