mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	audiotestsrc: add timestamps
This commit is contained in:
		
							parent
							
								
									4b83d6cfc8
								
							
						
					
					
						commit
						49cfe41c94
					
				
					 1 changed files with 69 additions and 44 deletions
				
			
		| 
						 | 
					@ -73,8 +73,9 @@ struct _SpaAudioTestSrc {
 | 
				
			||||||
  struct itimerspec timerspec;
 | 
					  struct itimerspec timerspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SpaPortInfo info;
 | 
					  SpaPortInfo info;
 | 
				
			||||||
  SpaAllocParam *params[1];
 | 
					  SpaAllocParam *params[2];
 | 
				
			||||||
  SpaAllocParamBuffers param_buffers;
 | 
					  SpaAllocParamBuffers param_buffers;
 | 
				
			||||||
 | 
					  SpaAllocParamMetaEnable param_meta;
 | 
				
			||||||
  SpaPortStatus status;
 | 
					  SpaPortStatus status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool have_format;
 | 
					  bool have_format;
 | 
				
			||||||
| 
						 | 
					@ -243,50 +244,12 @@ fill_buffer (SpaAudioTestSrc *this, ATSBuffer *b)
 | 
				
			||||||
    p[i] = rand();
 | 
					    p[i] = rand();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  this->sample_count += b->size / this->bpf;
 | 
					 | 
				
			||||||
  this->elapsed_time = SAMPLES_TO_TIME (this, this->sample_count);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return SPA_RESULT_OK;
 | 
					  return SPA_RESULT_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int audiotestsrc_on_output (SpaPollNotifyData *data);
 | 
					static int audiotestsrc_on_output (SpaPollNotifyData *data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static SpaResult
 | 
					static SpaResult update_poll_enabled (SpaAudioTestSrc *this, bool enabled);
 | 
				
			||||||
update_poll_enabled (SpaAudioTestSrc *this, bool enabled)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  SpaNodeEvent event;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (this->event_cb) {
 | 
					 | 
				
			||||||
    event.type = SPA_NODE_EVENT_TYPE_UPDATE_POLL;
 | 
					 | 
				
			||||||
    this->timer.enabled = enabled;
 | 
					 | 
				
			||||||
    if (this->props[1].live) {
 | 
					 | 
				
			||||||
      if (enabled) {
 | 
					 | 
				
			||||||
        uint64_t next_time = this->start_time + this->elapsed_time;
 | 
					 | 
				
			||||||
        fprintf (stderr, "%"PRIu64"\n", next_time);
 | 
					 | 
				
			||||||
        this->timerspec.it_value.tv_sec = next_time / 1000000000;
 | 
					 | 
				
			||||||
        this->timerspec.it_value.tv_nsec = next_time % 1000000000;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      else {
 | 
					 | 
				
			||||||
        this->timerspec.it_value.tv_sec = 0;
 | 
					 | 
				
			||||||
        this->timerspec.it_value.tv_nsec = 0;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      timerfd_settime (this->fds[0].fd, TFD_TIMER_ABSTIME, &this->timerspec, NULL);
 | 
					 | 
				
			||||||
      this->timer.fds = this->fds;
 | 
					 | 
				
			||||||
      this->timer.n_fds = 1;
 | 
					 | 
				
			||||||
      this->timer.idle_cb = NULL;
 | 
					 | 
				
			||||||
      this->timer.after_cb = audiotestsrc_on_output;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      this->timer.fds = NULL;
 | 
					 | 
				
			||||||
      this->timer.n_fds = 0;
 | 
					 | 
				
			||||||
      this->timer.idle_cb = audiotestsrc_on_output;
 | 
					 | 
				
			||||||
      this->timer.after_cb = NULL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    event.data = &this->timer;
 | 
					 | 
				
			||||||
    event.size = sizeof (this->timer);
 | 
					 | 
				
			||||||
    this->event_cb (&this->node, &event, this->user_data);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return SPA_RESULT_OK;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
audiotestsrc_on_output (SpaPollNotifyData *data)
 | 
					audiotestsrc_on_output (SpaPollNotifyData *data)
 | 
				
			||||||
| 
						 | 
					@ -295,14 +258,23 @@ audiotestsrc_on_output (SpaPollNotifyData *data)
 | 
				
			||||||
  ATSBuffer *b;
 | 
					  ATSBuffer *b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SPA_QUEUE_POP_HEAD (&this->empty, ATSBuffer, next, b);
 | 
					  SPA_QUEUE_POP_HEAD (&this->empty, ATSBuffer, next, b);
 | 
				
			||||||
  fprintf (stderr, "on_output %p\n", b);
 | 
					 | 
				
			||||||
  if (b == NULL) {
 | 
					  if (b == NULL) {
 | 
				
			||||||
    update_poll_enabled (this, false);
 | 
					    if (!this->props[1].live)
 | 
				
			||||||
 | 
					      update_poll_enabled (this, false);
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fill_buffer (this, b);
 | 
					  fill_buffer (this, b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (b->h) {
 | 
				
			||||||
 | 
					    b->h->seq = this->sample_count;
 | 
				
			||||||
 | 
					    b->h->pts = this->start_time + this->elapsed_time;
 | 
				
			||||||
 | 
					    b->h->dts_offset = 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  this->sample_count += b->size / this->bpf;
 | 
				
			||||||
 | 
					  this->elapsed_time = SAMPLES_TO_TIME (this, this->sample_count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (this->props[1].live) {
 | 
					  if (this->props[1].live) {
 | 
				
			||||||
    uint64_t expirations, next_time;
 | 
					    uint64_t expirations, next_time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -342,6 +314,42 @@ update_state (SpaAudioTestSrc *this, SpaNodeState state)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static SpaResult
 | 
				
			||||||
 | 
					update_poll_enabled (SpaAudioTestSrc *this, bool enabled)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  SpaNodeEvent event;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (this->event_cb) {
 | 
				
			||||||
 | 
					    event.type = SPA_NODE_EVENT_TYPE_UPDATE_POLL;
 | 
				
			||||||
 | 
					    this->timer.enabled = enabled;
 | 
				
			||||||
 | 
					    if (this->props[1].live) {
 | 
				
			||||||
 | 
					      if (enabled) {
 | 
				
			||||||
 | 
					        uint64_t next_time = this->start_time + this->elapsed_time;
 | 
				
			||||||
 | 
					        this->timerspec.it_value.tv_sec = next_time / 1000000000;
 | 
				
			||||||
 | 
					        this->timerspec.it_value.tv_nsec = next_time % 1000000000;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else {
 | 
				
			||||||
 | 
					        this->timerspec.it_value.tv_sec = 0;
 | 
				
			||||||
 | 
					        this->timerspec.it_value.tv_nsec = 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      timerfd_settime (this->fds[0].fd, TFD_TIMER_ABSTIME, &this->timerspec, NULL);
 | 
				
			||||||
 | 
					      this->timer.fds = this->fds;
 | 
				
			||||||
 | 
					      this->timer.n_fds = 1;
 | 
				
			||||||
 | 
					      this->timer.idle_cb = NULL;
 | 
				
			||||||
 | 
					      this->timer.after_cb = audiotestsrc_on_output;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      this->timer.fds = NULL;
 | 
				
			||||||
 | 
					      this->timer.n_fds = 0;
 | 
				
			||||||
 | 
					      this->timer.idle_cb = audiotestsrc_on_output;
 | 
				
			||||||
 | 
					      this->timer.after_cb = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    event.data = &this->timer;
 | 
				
			||||||
 | 
					    event.size = sizeof (this->timer);
 | 
				
			||||||
 | 
					    this->event_cb (&this->node, &event, this->user_data);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return SPA_RESULT_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static SpaResult
 | 
					static SpaResult
 | 
				
			||||||
spa_audiotestsrc_node_send_command (SpaNode        *node,
 | 
					spa_audiotestsrc_node_send_command (SpaNode        *node,
 | 
				
			||||||
                                    SpaNodeCommand *command)
 | 
					                                    SpaNodeCommand *command)
 | 
				
			||||||
| 
						 | 
					@ -372,6 +380,7 @@ spa_audiotestsrc_node_send_command (SpaNode        *node,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      clock_gettime (CLOCK_MONOTONIC, &now);
 | 
					      clock_gettime (CLOCK_MONOTONIC, &now);
 | 
				
			||||||
      this->start_time = TIMESPEC_TO_TIME (&now);
 | 
					      this->start_time = TIMESPEC_TO_TIME (&now);
 | 
				
			||||||
 | 
					      this->sample_count = 0;
 | 
				
			||||||
      this->elapsed_time = 0;
 | 
					      this->elapsed_time = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      this->started = true;
 | 
					      this->started = true;
 | 
				
			||||||
| 
						 | 
					@ -573,7 +582,7 @@ spa_audiotestsrc_node_port_set_format (SpaNode            *node,
 | 
				
			||||||
    this->info.maxbuffering = -1;
 | 
					    this->info.maxbuffering = -1;
 | 
				
			||||||
    this->info.latency = BYTES_TO_TIME (this, 1024);
 | 
					    this->info.latency = BYTES_TO_TIME (this, 1024);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this->info.n_params = 1;
 | 
					    this->info.n_params = 2;
 | 
				
			||||||
    this->info.params = this->params;
 | 
					    this->info.params = this->params;
 | 
				
			||||||
    this->params[0] = &this->param_buffers.param;
 | 
					    this->params[0] = &this->param_buffers.param;
 | 
				
			||||||
    this->param_buffers.param.type = SPA_ALLOC_PARAM_TYPE_BUFFERS;
 | 
					    this->param_buffers.param.type = SPA_ALLOC_PARAM_TYPE_BUFFERS;
 | 
				
			||||||
| 
						 | 
					@ -583,6 +592,10 @@ spa_audiotestsrc_node_port_set_format (SpaNode            *node,
 | 
				
			||||||
    this->param_buffers.min_buffers = 2;
 | 
					    this->param_buffers.min_buffers = 2;
 | 
				
			||||||
    this->param_buffers.max_buffers = 32;
 | 
					    this->param_buffers.max_buffers = 32;
 | 
				
			||||||
    this->param_buffers.align = 16;
 | 
					    this->param_buffers.align = 16;
 | 
				
			||||||
 | 
					    this->params[1] = &this->param_meta.param;
 | 
				
			||||||
 | 
					    this->param_meta.param.type = SPA_ALLOC_PARAM_TYPE_META_ENABLE;
 | 
				
			||||||
 | 
					    this->param_meta.param.size = sizeof (this->param_meta);
 | 
				
			||||||
 | 
					    this->param_meta.type = SPA_META_TYPE_HEADER;
 | 
				
			||||||
    this->info.features = NULL;
 | 
					    this->info.features = NULL;
 | 
				
			||||||
    update_state (this, SPA_NODE_STATE_READY);
 | 
					    update_state (this, SPA_NODE_STATE_READY);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -672,7 +685,7 @@ spa_audiotestsrc_node_port_use_buffers (SpaNode         *node,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  clear_buffers (this);
 | 
					  clear_buffers (this);
 | 
				
			||||||
  if (buffers != NULL && n_buffers != 0) {
 | 
					  if (buffers != NULL && n_buffers != 0) {
 | 
				
			||||||
    unsigned int i;
 | 
					    unsigned int i, j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this->alloc_mem = spa_memory_alloc_size (SPA_MEMORY_POOL_LOCAL,
 | 
					    this->alloc_mem = spa_memory_alloc_size (SPA_MEMORY_POOL_LOCAL,
 | 
				
			||||||
                                             NULL,
 | 
					                                             NULL,
 | 
				
			||||||
| 
						 | 
					@ -684,6 +697,7 @@ spa_audiotestsrc_node_port_use_buffers (SpaNode         *node,
 | 
				
			||||||
      SpaMemoryRef *mem_ref;
 | 
					      SpaMemoryRef *mem_ref;
 | 
				
			||||||
      SpaMemory *mem;
 | 
					      SpaMemory *mem;
 | 
				
			||||||
      SpaData *d = SPA_BUFFER_DATAS (buffers[i]);
 | 
					      SpaData *d = SPA_BUFFER_DATAS (buffers[i]);
 | 
				
			||||||
 | 
					      SpaMeta *m = SPA_BUFFER_METAS (buffers[i]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      b = &this->alloc_buffers[i];
 | 
					      b = &this->alloc_buffers[i];
 | 
				
			||||||
      b->buffer.mem.mem = this->alloc_mem->mem;
 | 
					      b->buffer.mem.mem = this->alloc_mem->mem;
 | 
				
			||||||
| 
						 | 
					@ -692,6 +706,17 @@ spa_audiotestsrc_node_port_use_buffers (SpaNode         *node,
 | 
				
			||||||
      b->buffer.id = SPA_ID_INVALID;
 | 
					      b->buffer.id = SPA_ID_INVALID;
 | 
				
			||||||
      b->outbuf = buffers[i];
 | 
					      b->outbuf = buffers[i];
 | 
				
			||||||
      b->outstanding = true;
 | 
					      b->outstanding = true;
 | 
				
			||||||
 | 
					      b->h = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      for (j = 0; j < buffers[i]->n_metas; j++) {
 | 
				
			||||||
 | 
					        switch (m[j].type) {
 | 
				
			||||||
 | 
					          case SPA_META_TYPE_HEADER:
 | 
				
			||||||
 | 
					            b->h = SPA_MEMBER (buffers[i], m[j].offset, SpaMetaHeader);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					          default:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      mem_ref = &d[0].mem.mem;
 | 
					      mem_ref = &d[0].mem.mem;
 | 
				
			||||||
      if (!(mem = spa_memory_find (mem_ref))) {
 | 
					      if (!(mem = spa_memory_find (mem_ref))) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue