bastibe/SoundCard

Record and play continuously

pablodz opened this issue · 5 comments

Hello there,
what if I want and play continously? I mean, creating the object in the backend and just adding the data as is received: not creating the microphone object, capture the data and delete the microphone object.

Similar errors:
#94

Also after a continous record appears the error below
image

Assertion 's' failed at pulse/stream.c:1411, function pa_stream_connect_record(). Aborting.
Aborted

Can you try if the issue persists if you install the latest development version from here (github) instead of pypi?

For the problem

Assertion 's' failed at pulse/stream.c:1411, function pa_stream_connect_record(). Aborting.
Aborted

via pypi SoundCard==0.4.0 was the problem, now I have installed by source

git clone https://github.com/bastibe/SoundCard
cd SoundCard
sudo python3 setup.py install

and works without the initial error. However in the system appears that a mic is being created, capturing data and finally deleted (video). So, as I mention at the beginning, I think will be better if the mic is open and then we just capture the data as is received. Is this possible with soundcard?

simplescreenrecorder-2021-03-10_13.43.32.mp4

Thanks in advance.

Well, after a while and checking test_soundcard.py here is the solution, works well: this can be loaded in a python thread and we can process the array instead of adding latency saving files

File

# Taken from https://github.com/bastibe/SoundCard
import soundcard as sc
import soundfile as sf
import numpy
import time

# get the current default microphone on your system:
default_mic = sc.default_microphone()

# alternatively, get a `Recorder` and `Player` object
# and play or record continuously:
record_object=default_mic.recorder(44100, channels=1, blocksize=256)

print(record_object)

seconds=0.5
numframes=int(44100*seconds)
max_iterations=100
expected_time_array=numpy.arange(seconds,(max_iterations+1)*seconds,seconds)

my_audio_streaming=[]

with record_object as r:
    start_time=time.time()
    for number in range(max_iterations):
        
        data=r.record(numframes)
        my_audio_streaming.append(data)
        # sf.write('temporal/pysoundcard_record_continously_{}.wav'.format(number), data, 44100, 'PCM_32') # add more seconds, not recommended
        now=time.time()        
        print("[{}] \tReal: {} \tExpected: {} \tNumframes:{}".format(number, round(now-start_time,4),expected_time_array[number],numframes))

Output:

<soundcard.pulseaudio._Recorder object at 0x7ff71b24ca50>
[0]     Real: 0.4972    Expected: 0.5   Numframes:22050
[1]     Real: 0.9985    Expected: 1.0   Numframes:22050
[2]     Real: 1.4986    Expected: 1.5   Numframes:22050
[3]     Real: 1.9974    Expected: 2.0   Numframes:22050
[4]     Real: 2.4977    Expected: 2.5   Numframes:22050
[5]     Real: 2.9989    Expected: 3.0   Numframes:22050
[6]     Real: 3.497     Expected: 3.5   Numframes:22050
[7]     Real: 3.9976    Expected: 4.0   Numframes:22050
[8]     Real: 4.4993    Expected: 4.5   Numframes:22050
[9]     Real: 4.9978    Expected: 5.0   Numframes:22050
[10]    Real: 5.4982    Expected: 5.5   Numframes:22050
[11]    Real: 5.998     Expected: 6.0   Numframes:22050
[12]    Real: 6.4974    Expected: 6.5   Numframes:22050
[13]    Real: 6.998     Expected: 7.0   Numframes:22050
[14]    Real: 7.4974    Expected: 7.5   Numframes:22050
[15]    Real: 7.9981    Expected: 8.0   Numframes:22050
[16]    Real: 8.4992    Expected: 8.5   Numframes:22050
[17]    Real: 8.9992    Expected: 9.0   Numframes:22050
[18]    Real: 9.4984    Expected: 9.5   Numframes:22050
[19]    Real: 9.9975    Expected: 10.0  Numframes:22050
[20]    Real: 10.4987   Expected: 10.5  Numframes:22050
[21]    Real: 10.9992   Expected: 11.0  Numframes:22050
[22]    Real: 11.5002   Expected: 11.5  Numframes:22050
[23]    Real: 11.9999   Expected: 12.0  Numframes:22050
[24]    Real: 12.4991   Expected: 12.5  Numframes:22050
[25]    Real: 12.9979   Expected: 13.0  Numframes:22050
[26]    Real: 13.499    Expected: 13.5  Numframes:22050
[27]    Real: 13.9978   Expected: 14.0  Numframes:22050
[28]    Real: 14.4973   Expected: 14.5  Numframes:22050
[29]    Real: 14.9993   Expected: 15.0  Numframes:22050
[30]    Real: 15.4986   Expected: 15.5  Numframes:22050
[31]    Real: 15.9981   Expected: 16.0  Numframes:22050
[32]    Real: 16.4993   Expected: 16.5  Numframes:22050
[33]    Real: 16.9978   Expected: 17.0  Numframes:22050
[34]    Real: 17.4996   Expected: 17.5  Numframes:22050
[35]    Real: 17.9984   Expected: 18.0  Numframes:22050
[36]    Real: 18.4988   Expected: 18.5  Numframes:22050
[37]    Real: 18.9998   Expected: 19.0  Numframes:22050
[38]    Real: 19.4985   Expected: 19.5  Numframes:22050
[39]    Real: 19.9975   Expected: 20.0  Numframes:22050
[40]    Real: 20.4979   Expected: 20.5  Numframes:22050
[41]    Real: 20.9976   Expected: 21.0  Numframes:22050
[42]    Real: 21.4987   Expected: 21.5  Numframes:22050
[43]    Real: 22.0      Expected: 22.0  Numframes:22050
[44]    Real: 22.5047   Expected: 22.5  Numframes:22050
[45]    Real: 23.0025   Expected: 23.0  Numframes:22050
[46]    Real: 23.5039   Expected: 23.5  Numframes:22050
[47]    Real: 24.005    Expected: 24.0  Numframes:22050
[48]    Real: 24.5048   Expected: 24.5  Numframes:22050
[49]    Real: 25.0032   Expected: 25.0  Numframes:22050
[50]    Real: 25.5042   Expected: 25.5  Numframes:22050
[51]    Real: 26.0036   Expected: 26.0  Numframes:22050
[52]    Real: 26.5039   Expected: 26.5  Numframes:22050
[53]    Real: 27.0044   Expected: 27.0  Numframes:22050
[54]    Real: 27.5028   Expected: 27.5  Numframes:22050
[55]    Real: 28.0037   Expected: 28.0  Numframes:22050
[56]    Real: 28.5021   Expected: 28.5  Numframes:22050
[57]    Real: 29.0093   Expected: 29.0  Numframes:22050
[58]    Real: 29.4998   Expected: 29.5  Numframes:22050
[59]    Real: 30.0018   Expected: 30.0  Numframes:22050
[60]    Real: 30.5007   Expected: 30.5  Numframes:22050
[61]    Real: 31.0036   Expected: 31.0  Numframes:22050
[62]    Real: 31.5032   Expected: 31.5  Numframes:22050
[63]    Real: 32.0056   Expected: 32.0  Numframes:22050
[64]    Real: 32.5036   Expected: 32.5  Numframes:22050
[65]    Real: 33.0001   Expected: 33.0  Numframes:22050
[66]    Real: 33.5085   Expected: 33.5  Numframes:22050
[67]    Real: 34.0039   Expected: 34.0  Numframes:22050
[68]    Real: 34.5017   Expected: 34.5  Numframes:22050
[69]    Real: 35.0092   Expected: 35.0  Numframes:22050
[70]    Real: 35.5033   Expected: 35.5  Numframes:22050
[71]    Real: 36.0046   Expected: 36.0  Numframes:22050
[72]    Real: 36.5116   Expected: 36.5  Numframes:22050
[73]    Real: 37.0062   Expected: 37.0  Numframes:22050
[74]    Real: 37.5051   Expected: 37.5  Numframes:22050
[75]    Real: 38.0013   Expected: 38.0  Numframes:22050
[76]    Real: 38.5004   Expected: 38.5  Numframes:22050
[77]    Real: 39.0009   Expected: 39.0  Numframes:22050
[78]    Real: 39.501    Expected: 39.5  Numframes:22050
[79]    Real: 40.0009   Expected: 40.0  Numframes:22050
[80]    Real: 40.4996   Expected: 40.5  Numframes:22050
[81]    Real: 41.0078   Expected: 41.0  Numframes:22050
[82]    Real: 41.4988   Expected: 41.5  Numframes:22050
[83]    Real: 41.9999   Expected: 42.0  Numframes:22050
[84]    Real: 42.5011   Expected: 42.5  Numframes:22050
[85]    Real: 43.0009   Expected: 43.0  Numframes:22050
[86]    Real: 43.4994   Expected: 43.5  Numframes:22050
[87]    Real: 44.0091   Expected: 44.0  Numframes:22050
[88]    Real: 44.4984   Expected: 44.5  Numframes:22050
[89]    Real: 45.0095   Expected: 45.0  Numframes:22050
[90]    Real: 45.4999   Expected: 45.5  Numframes:22050
[91]    Real: 46.0007   Expected: 46.0  Numframes:22050
[92]    Real: 46.4993   Expected: 46.5  Numframes:22050
[93]    Real: 47.009    Expected: 47.0  Numframes:22050
[94]    Real: 47.5094   Expected: 47.5  Numframes:22050
[95]    Real: 48.0056   Expected: 48.0  Numframes:22050
[96]    Real: 48.5014   Expected: 48.5  Numframes:22050
[97]    Real: 49.0092   Expected: 49.0  Numframes:22050
[98]    Real: 49.509    Expected: 49.5  Numframes:22050
[99]    Real: 49.9976   Expected: 50.0  Numframes:22050

However in the system appears that a mic is being created, capturing data and finally deleted (video)

I think that is just how pulseaudio works when capturing an output. But I might be wrong.

Anyway, I'm glad you found a solution to your problem. I'll try to release a new version of SoundCard, soon.