Skip to main content

This library was created to help store audio data in a numpy array. It allows for writing lists and numpy arrays into a circular buffer. You can read the data from the buffer with overlap to perform smooth FFTs. The buffer is a wrapper around a numpy ndarray. It contains a start and end position to keep track of where to read and write the data.

Main Functions:
  • clear() - Clear the length, start, and end indexes

  • get_data() - Return a copy of the data without moving indexes

  • set_data(data) - Set the data and change the shape of the buffer to this data shape

  • write(data, error) - Write data into the buffer and move the end index

  • read(amount) - Read data from the buffer and move the start index. If the amount is greater that what is in the buffer return a 0 length buffer

Extra Functions to help with the start and end pointers:
  • expanding_write(data, error) - Write data into the buffer. If the data is larger than the buffer expand the buffer

  • growing_write(data) - Write data into the buffer if there is not enough space make the buffer larger

  • write_value(value, length, error=True, move_start=True) - Write a value into the buffer for the given length. This is more efficient then creating and writing an array of a single value.

  • write_zeros(length, error=True, move_start=True) - Write Zeros for the given length. This is more efficient then creating and writing an array of zeros.

  • read_remaining(amount) - Read the amount or read all of the data available to read

  • read_overlap(amount, increment) - Read the amount of data given, but only increment the start index by the increment amount. This makes the next read, read some duplicate data (hence overlap)

Buffer Control Functions:
  • maxsize - (property) change the amount of samples that can be held

  • columns - (property) Number of columns that the array contains (shape[1])

  • shape - (property) Change the shape of the buffer

  • dtype - (property) Change the data type for the numpy buffer

  • get_indexes(start, length) - Return a list of indexes for reading and writing (this makes the buffer circular)

  • move_start(amount, error) - Move the start index (read)

  • move_end(amount, error) - Move the end index (write)

  • get_available_space() - return the amount of data that the buffer can still hold

Example - simple example

Simple reading and writing. See test_buffer for tests and usage.

import numpy as np
import np_rw_buffer

buffer = np_rw_buffer.RingBuffer(10)

buffer.write(np.arange(5))
r = buffer.read(4)
assert np.all(r == np.arange(4).reshape((-1, 1)))

# Not enough data, don't read anything (use read_remaining or get_data)
d = np.arange(5).reshape((-1, 1))
buffer.write(d)
r = buffer.read(10)
assert len(r) == 0
assert len(buffer) == 6

r = buffer.read()
assert len(r) == 6
assert np.all(r == np.vstack((d[-1:], d)))

buffer.write(np.arange(6))
# buffer.write(np.arange(5))  # Raises an OverflowError
buffer.write(np.arange(5), False)

Example - AudioFramingBuffer

The AudioFramingBuffer is slightly different from the RingBuffer. It has a sample_rate, seconds, and buffer_delay.

It’s main differences are how it reads and writes. The start and end pointers are completely different and decoupled. The start pointer can underrun the end pointer and back fills with 0’s. The end pointer can overrun the start pointer.

import numpy as np
from np_rw_buffer import AudioFramingBuffer

buffer = AudioFramingBuffer(2000, 1)
buffer.write(np.array([(i,) for i in range(10)]))
# Buffer: [(read ptr)0, 1, 2, 3, 4, 5, 6, 7, 8, 9, (write ptr) 0, 0, 0, 0, 0]
assert buffer._end == 10
assert buffer._start == 0

# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, (write ptr) 0, 0, 0, 0, 0] (read ptr at end)
assert np.all(buffer.read(15) == np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0]).reshape((-1, 1)))
assert buffer._start == 15
assert buffer._end == 10

buffer.write(np.array([(i,) for i in range(10)])) # This will write in the position after 19
# Buffer: [0, 0, 0, 0, 0, 0, 0, 0, 0, (was 9) 0, 0, 1, 2, 3, 4, (read ptr) 5, 6, 7, 8, 9] (write ptr at end)
assert buffer._end == 20
assert buffer._start == 15

# [5, 6, 7, 8, 9, (write ptr) 0, 0, 0, 0, 0] (read ptr at end)
assert np.all(buffer.read(10) == np.array([5, 6, 7, 8, 9, 0, 0, 0, 0, 0]).reshape((-1, 1)))

Metadata

Release files for np-rw-buffer 1.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for np-rw-buffer 1.2.0
File Size Uploaded
np_rw_buffer-1.2.0.tar.gz 20.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for np-rw-buffer 1.2.0
File Interpreter ABI Platform
np_rw_buffer-1.2.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details

Total release size: 43.2 kB

Release files / np_rw_buffer-1.2.0.tar.gz

Download URL np_rw_buffer-1.2.0.tar.gz
Size 20.6 kB
Tags Source
SHA-256 checksum
How to use checksums
b7eb843825d5f07fda9b78fd3f2e4291fb2b8b64ad31c14effdb8854030344f9
BLAKE2b-256 checksum
How to use checksums
0ba2c7e4d35018e0674d8022885887fec6849c57ec68919a70ccf1cedab1f77f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.0

Release files / np_rw_buffer-1.2.0-cp313-cp313-win_amd64.whl

Download URL np_rw_buffer-1.2.0-cp313-cp313-win_amd64.whl
Size 22.6 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
8048381d469fbd7751d4d53aab5fc83ceef677feaa4d00cf5cc3aa3cea2a71e6
BLAKE2b-256 checksum
How to use checksums
a4f3ba29dfea0f791b3078e0a79f7f25289904aa0175219c03c0f527df2af971
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.0

Release history Release notifications | RSS feed

This release

1.2.0 This release

2 release files

1.1.8

9 release files

1.1.7

1 release file

1.1.6

1 release file

1.1.5

1 release file

1.1.4

1 release file

1.1.3

1 release file

1.1.2

1 release file

1.1.1

1 release file

1.1.0

1 release file

1.0.2

1 release file

1.0.1

1 release file

1.0.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page