mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	small cleanups
Remove ringbuffer code and use inline in the .h file Add some more port status flags Improve inspect output
This commit is contained in:
		
							parent
							
								
									50c3b40cd0
								
							
						
					
					
						commit
						6b3bb79e70
					
				
					 8 changed files with 201 additions and 211 deletions
				
			
		| 
						 | 
					@ -31,7 +31,6 @@
 | 
				
			||||||
#include <pinos/client/ringbuffer.h>
 | 
					#include <pinos/client/ringbuffer.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/include/spa/ringbuffer.h>
 | 
					#include <spa/include/spa/ringbuffer.h>
 | 
				
			||||||
#include <spa/lib/ringbuffer.c>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PINOS_RINGBUFFER_GET_PRIVATE(rb)  \
 | 
					#define PINOS_RINGBUFFER_GET_PRIVATE(rb)  \
 | 
				
			||||||
   (G_TYPE_INSTANCE_GET_PRIVATE ((rb), PINOS_TYPE_RINGBUFFER, PinosRingbufferPrivate))
 | 
					   (G_TYPE_INSTANCE_GET_PRIVATE ((rb), PINOS_TYPE_RINGBUFFER, PinosRingbufferPrivate))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -132,13 +132,17 @@ SpaPortInfo *   spa_port_info_copy_into   (void *dest, const SpaPortInfo *info);
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * SpaPortStatusFlags:
 | 
					 * SpaPortStatusFlags:
 | 
				
			||||||
 * @SPA_PORT_STATUS_FLAG_NONE: no status flags
 | 
					 * @SPA_PORT_STATUS_FLAG_NONE: no status flags
 | 
				
			||||||
 | 
					 * @SPA_PORT_STATUS_FLAG_HAVE_FORMAT: port has a format
 | 
				
			||||||
 | 
					 * @SPA_PORT_STATUS_FLAG_HAVE_BUFFERS: port has buffers
 | 
				
			||||||
 * @SPA_PORT_STATUS_FLAG_HAVE_OUTPUT: port has output
 | 
					 * @SPA_PORT_STATUS_FLAG_HAVE_OUTPUT: port has output
 | 
				
			||||||
 * @SPA_PORT_STATUS_FLAG_NEED_INPUT: port needs input
 | 
					 * @SPA_PORT_STATUS_FLAG_NEED_INPUT: port needs input
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
  SPA_PORT_STATUS_FLAG_NONE                  = 0,
 | 
					  SPA_PORT_STATUS_FLAG_NONE                  = 0,
 | 
				
			||||||
  SPA_PORT_STATUS_FLAG_HAVE_OUTPUT           = 1 << 0,
 | 
					  SPA_PORT_STATUS_FLAG_HAVE_FORMAT           = 1 << 0,
 | 
				
			||||||
  SPA_PORT_STATUS_FLAG_NEED_INPUT            = 1 << 1,
 | 
					  SPA_PORT_STATUS_FLAG_HAVE_BUFFERS          = 1 << 1,
 | 
				
			||||||
 | 
					  SPA_PORT_STATUS_FLAG_HAVE_OUTPUT           = 1 << 2,
 | 
				
			||||||
 | 
					  SPA_PORT_STATUS_FLAG_NEED_INPUT            = 1 << 3,
 | 
				
			||||||
} SpaPortStatusFlags;
 | 
					} SpaPortStatusFlags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,20 +50,190 @@ struct _SpaRingbuffer {
 | 
				
			||||||
  size_t              size_mask;
 | 
					  size_t              size_mask;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SpaResult   spa_ringbuffer_init              (SpaRingbuffer *rbuf,
 | 
					/**
 | 
				
			||||||
                                              size_t size);
 | 
					 * spa_ringbuffer_init:
 | 
				
			||||||
 | 
					 * @rbuf: a #SpaRingbuffer
 | 
				
			||||||
 | 
					 * @data: pointer to an array
 | 
				
			||||||
 | 
					 * @size: the number of elements in @data
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Initialize a #SpaRingbuffer with @data and @size.
 | 
				
			||||||
 | 
					 * When size is a power of 2, size_mask will be set with the mask to
 | 
				
			||||||
 | 
					 * efficiently wrap around the indexes.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					spa_ringbuffer_init (SpaRingbuffer *rbuf,
 | 
				
			||||||
 | 
					                     size_t size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  rbuf->size = size;
 | 
				
			||||||
 | 
					  rbuf->readindex = 0;
 | 
				
			||||||
 | 
					  rbuf->writeindex = 0;
 | 
				
			||||||
 | 
					  if ((size & (size - 1)) == 0)
 | 
				
			||||||
 | 
					    rbuf->size_mask = size - 1;
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    rbuf->size_mask = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SpaResult   spa_ringbuffer_clear             (SpaRingbuffer *rbuf);
 | 
					/**
 | 
				
			||||||
 | 
					 * spa_ringbuffer_clear:
 | 
				
			||||||
 | 
					 * @rbuf: a #SpaRingbuffer
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Clear @rbuf
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					spa_ringbuffer_clear (SpaRingbuffer *rbuf)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  rbuf->readindex = 0;
 | 
				
			||||||
 | 
					  rbuf->writeindex = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SpaResult   spa_ringbuffer_get_read_areas    (SpaRingbuffer      *rbuf,
 | 
					/**
 | 
				
			||||||
                                              SpaRingbufferArea   areas[2]);
 | 
					 * spa_ringbuffer_get_read_areas:
 | 
				
			||||||
SpaResult   spa_ringbuffer_read_advance      (SpaRingbuffer      *rbuf,
 | 
					 * @rbuf: a #SpaRingbuffer
 | 
				
			||||||
                                              ssize_t             len);
 | 
					 * @areas: an array of #SpaRingbufferArea
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Fill @areas with pointers to read from. The total amount of
 | 
				
			||||||
 | 
					 * bytes that can be read can be obtained by summing the areas len fields.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					spa_ringbuffer_get_read_areas (SpaRingbuffer      *rbuf,
 | 
				
			||||||
 | 
					                               SpaRingbufferArea   areas[2])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t avail, end, w, r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SpaResult   spa_ringbuffer_get_write_areas   (SpaRingbuffer      *rbuf,
 | 
					  w = rbuf->writeindex;
 | 
				
			||||||
                                              SpaRingbufferArea   areas[2]);
 | 
					  r = rbuf->readindex;
 | 
				
			||||||
SpaResult   spa_ringbuffer_write_advance     (SpaRingbuffer      *rbuf,
 | 
					
 | 
				
			||||||
                                              ssize_t             len);
 | 
					  if (w > r) {
 | 
				
			||||||
 | 
					    avail = w - r;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    avail = (w - r + rbuf->size);
 | 
				
			||||||
 | 
					    avail = (rbuf->size_mask ? avail & rbuf->size_mask : avail % rbuf->size);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  end = r + avail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  areas[0].offset = r;
 | 
				
			||||||
 | 
					  areas[1].offset = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (end > rbuf->size) {
 | 
				
			||||||
 | 
					    areas[0].len = rbuf->size - r;
 | 
				
			||||||
 | 
					    areas[1].len = end - rbuf->size;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    areas[0].len = avail;
 | 
				
			||||||
 | 
					    areas[1].len = 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline size_t
 | 
				
			||||||
 | 
					spa_ringbuffer_get_read_offset (SpaRingbuffer *rbuf,
 | 
				
			||||||
 | 
					                                size_t        *offset)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t avail, w, r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  w = rbuf->writeindex;
 | 
				
			||||||
 | 
					  r = rbuf->readindex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (w > r) {
 | 
				
			||||||
 | 
					    avail = w - r;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    avail = (w - r + rbuf->size);
 | 
				
			||||||
 | 
					    avail = (rbuf->size_mask ? avail & rbuf->size_mask : avail % rbuf->size);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  *offset = r;
 | 
				
			||||||
 | 
					  return avail;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * spa_ringbuffer_read_advance:
 | 
				
			||||||
 | 
					 * @rbuf: a #SpaRingbuffer
 | 
				
			||||||
 | 
					 * @len: number of bytes to advance
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Advance the read pointer by @len
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					spa_ringbuffer_read_advance (SpaRingbuffer      *rbuf,
 | 
				
			||||||
 | 
					                             ssize_t             len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t tmp = rbuf->readindex + len;
 | 
				
			||||||
 | 
					  rbuf->readindex = (rbuf->size_mask ? tmp & rbuf->size_mask : tmp % rbuf->size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * spa_ringbuffer_get_write_areas:
 | 
				
			||||||
 | 
					 * @rbuf: a #SpaRingbuffer
 | 
				
			||||||
 | 
					 * @areas: an array of #SpaRingbufferArea
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Fill @areas with pointers to write to. The total amount of
 | 
				
			||||||
 | 
					 * bytes that can be written can be obtained by summing the areas len fields.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					spa_ringbuffer_get_write_areas (SpaRingbuffer      *rbuf,
 | 
				
			||||||
 | 
					                                SpaRingbufferArea   areas[2])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t avail, end, w, r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  w = rbuf->writeindex;
 | 
				
			||||||
 | 
					  r = rbuf->readindex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (w > r) {
 | 
				
			||||||
 | 
					    avail = (r - w + rbuf->size);
 | 
				
			||||||
 | 
					    avail = (rbuf->size_mask ? avail & rbuf->size_mask : avail % rbuf->size);
 | 
				
			||||||
 | 
					  } else if (w < r) {
 | 
				
			||||||
 | 
					    avail = r - w;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    avail = rbuf->size;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  avail -= 1;
 | 
				
			||||||
 | 
					  end = w + avail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  areas[0].offset = w;
 | 
				
			||||||
 | 
					  areas[1].offset = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (end > rbuf->size) {
 | 
				
			||||||
 | 
					    areas[0].len = rbuf->size - w;
 | 
				
			||||||
 | 
					    areas[1].len = end - rbuf->size;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    areas[0].len = avail;
 | 
				
			||||||
 | 
					    areas[1].len = 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline size_t
 | 
				
			||||||
 | 
					spa_ringbuffer_get_write_offset (SpaRingbuffer *rbuf,
 | 
				
			||||||
 | 
					                                 size_t        *offset)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t avail, w, r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  w = rbuf->writeindex;
 | 
				
			||||||
 | 
					  r = rbuf->readindex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (w > r) {
 | 
				
			||||||
 | 
					    avail = (r - w + rbuf->size);
 | 
				
			||||||
 | 
					    avail = (rbuf->size_mask ? avail & rbuf->size_mask : avail % rbuf->size);
 | 
				
			||||||
 | 
					  } else if (w < r) {
 | 
				
			||||||
 | 
					    avail = r - w;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    avail = rbuf->size;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  avail -= 1;
 | 
				
			||||||
 | 
					  *offset = w;
 | 
				
			||||||
 | 
					  return avail;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * spa_ringbuffer_write_advance:
 | 
				
			||||||
 | 
					 * @rbuf: a #SpaRingbuffer
 | 
				
			||||||
 | 
					 * @len: number of bytes to advance
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Advance the write pointer by @len
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					spa_ringbuffer_write_advance (SpaRingbuffer      *rbuf,
 | 
				
			||||||
 | 
					                              ssize_t             len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t tmp = rbuf->writeindex + len;
 | 
				
			||||||
 | 
					  rbuf->writeindex = (rbuf->size_mask ? tmp & rbuf->size_mask : tmp % rbuf->size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}  /* extern "C" */
 | 
					}  /* extern "C" */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,6 @@ spalib_sources = ['audio-raw.c',
 | 
				
			||||||
                  'mapper.c',
 | 
					                  'mapper.c',
 | 
				
			||||||
                  'port.c',
 | 
					                  'port.c',
 | 
				
			||||||
                  'props.c',
 | 
					                  'props.c',
 | 
				
			||||||
                  'ringbuffer.c',
 | 
					 | 
				
			||||||
                  'video-raw.c']
 | 
					                  'video-raw.c']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
spalib = shared_library('spa-lib',
 | 
					spalib = shared_library('spa-lib',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,186 +0,0 @@
 | 
				
			||||||
/* Simple Plugin API
 | 
					 | 
				
			||||||
 * Copyright (C) 2016 Wim Taymans <wim.taymans@gmail.com>
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This library is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
 * modify it under the terms of the GNU Library General Public
 | 
					 | 
				
			||||||
 * License as published by the Free Software Foundation; either
 | 
					 | 
				
			||||||
 * version 2 of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This library is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
					 | 
				
			||||||
 * Library General Public License for more details.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * You should have received a copy of the GNU Library General Public
 | 
					 | 
				
			||||||
 * License along with this library; if not, write to the
 | 
					 | 
				
			||||||
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 | 
					 | 
				
			||||||
 * Boston, MA 02110-1301, USA.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <spa/ringbuffer.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * spa_ringbuffer_init:
 | 
					 | 
				
			||||||
 * @rbuf: a #SpaRingbuffer
 | 
					 | 
				
			||||||
 * @data: pointer to an array
 | 
					 | 
				
			||||||
 * @size: the number of elements in @data
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Initialize a #SpaRingbuffer with @data and @size.
 | 
					 | 
				
			||||||
 * When size is a power of 2, size_mask will be set with the mask to
 | 
					 | 
				
			||||||
 * efficiently wrap around the indexes.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Returns: #SPA_RESULT_OK on success
 | 
					 | 
				
			||||||
 *          #SPA_RESULT_INVALID_ARGUMENTS when data or rbuf is %NULL
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
SpaResult
 | 
					 | 
				
			||||||
spa_ringbuffer_init (SpaRingbuffer *rbuf,
 | 
					 | 
				
			||||||
                     size_t size)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  if (rbuf == NULL || size == 0)
 | 
					 | 
				
			||||||
    return SPA_RESULT_INVALID_ARGUMENTS;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  rbuf->size = size;
 | 
					 | 
				
			||||||
  rbuf->readindex = 0;
 | 
					 | 
				
			||||||
  rbuf->writeindex = 0;
 | 
					 | 
				
			||||||
  if ((size & (size - 1)) == 0)
 | 
					 | 
				
			||||||
    rbuf->size_mask = size - 1;
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    rbuf->size_mask = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return SPA_RESULT_OK;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * spa_ringbuffer_clear:
 | 
					 | 
				
			||||||
 * @rbuf: a #SpaRingbuffer
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Clear @rbuf
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Returns: #SPA_RESULT_OK
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
SpaResult
 | 
					 | 
				
			||||||
spa_ringbuffer_clear (SpaRingbuffer *rbuf)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  rbuf->readindex = 0;
 | 
					 | 
				
			||||||
  rbuf->writeindex = 0;
 | 
					 | 
				
			||||||
  return SPA_RESULT_OK;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * spa_ringbuffer_get_read_areas:
 | 
					 | 
				
			||||||
 * @rbuf: a #SpaRingbuffer
 | 
					 | 
				
			||||||
 * @areas: an array of #SpaRingbufferArea
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Fill @areas with pointers to read from. The total amount of
 | 
					 | 
				
			||||||
 * bytes that can be read can be obtained by summing the areas len fields.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Returns: #SPA_RESULT_OK
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
SpaResult
 | 
					 | 
				
			||||||
spa_ringbuffer_get_read_areas (SpaRingbuffer      *rbuf,
 | 
					 | 
				
			||||||
                               SpaRingbufferArea   areas[2])
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  size_t avail, end, w, r;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  w = rbuf->writeindex;
 | 
					 | 
				
			||||||
  r = rbuf->readindex;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (w > r) {
 | 
					 | 
				
			||||||
    avail = w - r;
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    avail = (w - r + rbuf->size);
 | 
					 | 
				
			||||||
    avail = (rbuf->size_mask ? avail & rbuf->size_mask : avail % rbuf->size);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  end = r + avail;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  areas[0].offset = r;
 | 
					 | 
				
			||||||
  areas[1].offset = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (end > rbuf->size) {
 | 
					 | 
				
			||||||
    areas[0].len = rbuf->size - r;
 | 
					 | 
				
			||||||
    areas[1].len = end - rbuf->size;
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    areas[0].len = avail;
 | 
					 | 
				
			||||||
    areas[1].len = 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return SPA_RESULT_OK;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * spa_ringbuffer_read_advance:
 | 
					 | 
				
			||||||
 * @rbuf: a #SpaRingbuffer
 | 
					 | 
				
			||||||
 * @len: number of bytes to advance
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Advance the read pointer by @len
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Returns: #SPA_RESULT_OK
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
SpaResult
 | 
					 | 
				
			||||||
spa_ringbuffer_read_advance (SpaRingbuffer      *rbuf,
 | 
					 | 
				
			||||||
                             ssize_t             len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  size_t tmp = rbuf->readindex + len;
 | 
					 | 
				
			||||||
  rbuf->readindex = (rbuf->size_mask ? tmp & rbuf->size_mask : tmp % rbuf->size);
 | 
					 | 
				
			||||||
  return SPA_RESULT_OK;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * spa_ringbuffer_get_write_areas:
 | 
					 | 
				
			||||||
 * @rbuf: a #SpaRingbuffer
 | 
					 | 
				
			||||||
 * @areas: an array of #SpaRingbufferArea
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Fill @areas with pointers to write to. The total amount of
 | 
					 | 
				
			||||||
 * bytes that can be written can be obtained by summing the areas len fields.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Returns: #SPA_RESULT_OK
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
SpaResult
 | 
					 | 
				
			||||||
spa_ringbuffer_get_write_areas (SpaRingbuffer      *rbuf,
 | 
					 | 
				
			||||||
                                SpaRingbufferArea   areas[2])
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  size_t avail, end, w, r;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  w = rbuf->writeindex;
 | 
					 | 
				
			||||||
  r = rbuf->readindex;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (w > r) {
 | 
					 | 
				
			||||||
    avail = (r - w + rbuf->size);
 | 
					 | 
				
			||||||
    avail = (rbuf->size_mask ? avail & rbuf->size_mask : avail % rbuf->size);
 | 
					 | 
				
			||||||
  } else if (w < r) {
 | 
					 | 
				
			||||||
    avail = r - w;
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    avail = rbuf->size;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  avail -= 1;
 | 
					 | 
				
			||||||
  end = w + avail;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  areas[0].offset = w;
 | 
					 | 
				
			||||||
  areas[1].offset = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (end > rbuf->size) {
 | 
					 | 
				
			||||||
    areas[0].len = rbuf->size - w;
 | 
					 | 
				
			||||||
    areas[1].len = end - rbuf->size;
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    areas[0].len = avail;
 | 
					 | 
				
			||||||
    areas[1].len = 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return SPA_RESULT_OK;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * spa_ringbuffer_write_advance:
 | 
					 | 
				
			||||||
 * @rbuf: a #SpaRingbuffer
 | 
					 | 
				
			||||||
 * @len: number of bytes to advance
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Advance the write pointer by @len
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Returns: #SPA_RESULT_OK
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
SpaResult
 | 
					 | 
				
			||||||
spa_ringbuffer_write_advance (SpaRingbuffer      *rbuf,
 | 
					 | 
				
			||||||
                              ssize_t             len)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  size_t tmp = rbuf->writeindex + len;
 | 
					 | 
				
			||||||
  rbuf->writeindex = (rbuf->size_mask ? tmp & rbuf->size_mask : tmp % rbuf->size);
 | 
					 | 
				
			||||||
  return SPA_RESULT_OK;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -78,13 +78,16 @@ inspect_node (SpaNode *node)
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    spa_debug_props (props, true);
 | 
					    spa_debug_props (props, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((res = spa_node_get_n_ports (node, &n_input, &max_input, &n_output, &max_output)) < 0)
 | 
					  if ((res = spa_node_get_n_ports (node, &n_input, &max_input, &n_output, &max_output)) < 0) {
 | 
				
			||||||
    printf ("can't get n_ports: %d\n", res);
 | 
					    printf ("can't get n_ports: %d\n", res);
 | 
				
			||||||
  else
 | 
					    return;
 | 
				
			||||||
    printf ("supported ports %d %d %d %d\n", n_input, max_input, n_output, max_output);
 | 
					  }
 | 
				
			||||||
 | 
					  printf ("supported ports:\n");
 | 
				
			||||||
 | 
					  printf ("input ports:  %d/%d\n", n_input, max_input);
 | 
				
			||||||
 | 
					  printf ("output ports: %d/%d\n", n_output, max_output);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  in_ports = alloca (n_input * sizeof (uint32_t));
 | 
					  in_ports = alloca (n_input * sizeof (uint32_t));
 | 
				
			||||||
  out_ports = alloca (n_input * sizeof (uint32_t));
 | 
					  out_ports = alloca (n_output * sizeof (uint32_t));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((res = spa_node_get_port_ids (node, n_input, in_ports, n_output, out_ports)) < 0)
 | 
					  if ((res = spa_node_get_port_ids (node, n_input, in_ports, n_output, out_ports)) < 0)
 | 
				
			||||||
    printf ("can't get port ids: %d\n", res);
 | 
					    printf ("can't get port ids: %d\n", res);
 | 
				
			||||||
| 
						 | 
					@ -93,6 +96,7 @@ inspect_node (SpaNode *node)
 | 
				
			||||||
    printf (" input port: %08x\n", in_ports[i]);
 | 
					    printf (" input port: %08x\n", in_ports[i]);
 | 
				
			||||||
    inspect_port (node, SPA_DIRECTION_INPUT, in_ports[i]);
 | 
					    inspect_port (node, SPA_DIRECTION_INPUT, in_ports[i]);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (i = 0; i < n_output; i++) {
 | 
					  for (i = 0; i < n_output; i++) {
 | 
				
			||||||
    printf (" output port: %08x\n", out_ports[i]);
 | 
					    printf (" output port: %08x\n", out_ports[i]);
 | 
				
			||||||
    inspect_port (node, SPA_DIRECTION_OUTPUT, out_ports[i]);
 | 
					    inspect_port (node, SPA_DIRECTION_OUTPUT, out_ports[i]);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue