update default parameters + python updates

- by default ggwave will now output 32-bit float samples
- python samples no longer use numpy
- python test now decodes payload
- fix buffer overflow in receive.py example
This commit is contained in:
Georgi Gerganov
2021-01-23 23:30:24 +02:00
parent ba8e0cd2b1
commit 105e0fd48d
7 changed files with 19 additions and 14 deletions

View File

@@ -134,7 +134,6 @@ Usage
import ggwave
import pyaudio
import numpy as np
p = pyaudio.PyAudio()
@@ -142,8 +141,8 @@ Usage
waveform = ggwave.encode("hello python", txProtocol = 1, volume = 20)
print("Transmitting text 'hello python' ...")
stream = p.open(format=pyaudio.paInt16, channels=1, rate=48000, output=True, frames_per_buffer=4096)
stream.write(np.array(waveform).astype(np.int16), len(waveform))
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=48000, output=True, frames_per_buffer=4096)
stream.write(waveform, len(waveform)//4)
stream.stop_stream()
stream.close()
@@ -165,7 +164,7 @@ Usage
try:
while True:
data = stream.read(1024)
data = stream.read(1024, exception_on_overflow=False)
res = ggwave.decode(instance, data)
if (not res is None):
try:

View File

@@ -8,7 +8,7 @@ README.rst is not commited to git because it is generated from [README-tmpl.rst]
## Building
Run `make build` to generate an extension module as .so file.
You can test it then by importing it from python interpreter `import ggwave` and running `ggwave.testC(...)` (you have to be positioned in the directory where .so was built).
You can test it then by importing it from python interpreter `import ggwave` and running `ggwave.encode('test')` (you have to be positioned in the directory where .so was built).
This is useful for testing while developing.
Run `make sdist` to create a source distribution, but not publish it - it is a tarball in dist/ that will be uploaded to pip on `publish`.

View File

@@ -3,7 +3,6 @@ cimport cython
from cpython.mem cimport PyMem_Malloc, PyMem_Free
import re
import struct
cimport cggwave
@@ -43,7 +42,7 @@ def encode(payload, txProtocolId = 1, volume = 10, instance = None):
if (own):
free(instance)
return struct.unpack("h"*n, output_bytes[0:2*n])
return output_bytes
def decode(instance, waveform):
""" Analyze and decode audio waveform to obtain original payload

View File

@@ -10,7 +10,7 @@ instance = ggwave.init()
try:
while True:
data = stream.read(1024)
data = stream.read(1024, exception_on_overflow=False)
res = ggwave.decode(instance, data)
if (not res is None):
try:

View File

@@ -1,6 +1,5 @@
import ggwave
import pyaudio
import numpy as np
p = pyaudio.PyAudio()
@@ -8,9 +7,8 @@ p = pyaudio.PyAudio()
waveform = ggwave.encode("hello python", txProtocolId = 1, volume = 20)
print("Transmitting text 'hello python' ...")
stream = p.open(format=pyaudio.paInt16, channels=1, rate=48000, output=True, frames_per_buffer=4096)
stream.write(np.array(waveform).astype(np.int16), len(waveform))
stream.write(np.zeros(16*1024), 16*1024) # short silence at the end
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=48000, output=True, frames_per_buffer=4096)
stream.write(waveform, len(waveform)//4)
stream.stop_stream()
stream.close()

View File

@@ -268,7 +268,7 @@ const GGWave::Parameters & GGWave::getDefaultParameters() {
GGWave::kBaseSampleRate,
GGWave::kDefaultSamplesPerFrame,
GGWAVE_SAMPLE_FORMAT_F32,
GGWAVE_SAMPLE_FORMAT_I16
GGWAVE_SAMPLE_FORMAT_F32,
};
return result;

View File

@@ -1,6 +1,15 @@
import sys
import ggwave
instance = ggwave.init()
payload = 'hello python'
# generate audio waveform for string "hello python"
waveform = ggwave.encode("hello python", txProtocolId = 1, volume = 20, instance = instance)
waveform = ggwave.encode(payload, txProtocolId = 1, volume = 20, instance = instance)
# decode the audio waveform back to text
res = ggwave.decode(instance, waveform)
if res != payload.encode():
sys.exit(1)