I have a dial tone python code which runs via Flask webserver, there are a couple variables in my code that I am trying to control through roundSlider widgets. The problem that I am facing with is that when I start the program it runs normally and I can smoothly control the sample_rate variable through my first slider and can hear different tones while dragging the first slider. But when I start dragging the second slider to change the amplitude value, it does changes (start hearing noisy static sound) but at the same time it resets the sample rate tone/sound to original (though this doesn't mean it changes the first slider visually/dynamically). Please, take a look at my code and see if you can help me with.
app.py code:
from __future__ import print_function
from gnuradio import analog
from gnuradio import audio
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser
class TopBlock22(gr.top_block): # PEP8: CamelCaseName for classes
def __init__(self, sample_rate=32000, amplitude=0):
gr.top_block.__init__(self, "Top Block 22")
##################################################
# Variables
##################################################
self.sample_rate = sample_rate
print('[TopBlock22] __init__: sample_rate:', self.sample_rate)
self.amplitude = amplitude
print('[TopBlock22] __init__: amplitude:', self.amplitude)
##################################################
# Blocks
##################################################
self.blocks_add_xx = blocks.add_vff(1)
self.audio_sink = audio.sink(32000, '', True)
self.analog_sig_source_x_1 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 440, amplitude, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 350, amplitude, 0)
self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN, amplitude, -42)
##################################################
# Connections
##################################################
self.connect((self.analog_noise_source_x_0, 0), (self.blocks_add_xx, 2))
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
self.connect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))
self.connect((self.blocks_add_xx, 0), (self.audio_sink, 0))
def change(self, sample_rate, amplitude):
self.sample_rate = sample_rate
print('[TopBlock22] __init__: sample_rate:', self.sample_rate)
self.analog_sig_source_x_1.set_sampling_freq(self.sample_rate)
self.analog_sig_source_x_0.set_sampling_freq(self.sample_rate)
# def set_amplitude(self, amplitude):
self.amplitude = amplitude
print('[TopBlock22] __init__: amplitude:', self.amplitude)
self.analog_sig_source_x_1.set_amplitude(self.amplitude)
self.analog_sig_source_x_0.set_amplitude(self.amplitude)
self.analog_noise_source_x_0.set_amplitude(self.amplitude)
# lock
self.lock()
# disconect - needs two endpoints (not like in FAQ)
self.disconnect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
self.disconnect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))
# create new
self.analog_sig_source_x_1 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 440, 0.4, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 350, 0.4, 0)
# connect again
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
self.connect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))
# unlock
self.unlock()
# -----------------------------------------------------------------------------
from flask import Flask, request, jsonify
app = Flask(__name__)
tb = None # global variable to keep it between requests
@app.route('/')
def index():
return '''<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>GNURadio Slider Example</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/roundSlider/1.3.2/roundslider.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/roundSlider/1.3.2/roundslider.min.js"></script>
</head>
<body>
<style>
#slider1 {
position:absolute;
top:100px;
left:75px;
align:center;
}
#slider2 {
position:absolute;
top:100px;
left:470px;
align:center;
}
#slider3 {
position:absolute;
top:100px;
left:870px;
align:center;
}
#slider4 {
position:absolute;
top:450px;
left:75px;
align:center;
}
#slider5 {
position:absolute;
top:450px;
left:470px;
align:center;
}
#slider6 {
position:absolute;
top:450px;
left:870px;
align:center;
}
</style>
</head>
<body>
<div id="slider1"></div>
<!-- <p>Sample Rate Slider</p> -->
<script>
// keep slider's value
var val;
// create slider
$("#slider1").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj = $("#slider1").data("roundSlider");
val = obj.getValue();
$.getJSON('/valueofslider', {
slide1_val: val
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide_val: val});
</script>
<div id="slider2"></div>
<!-- <p>Amplitude Slider2</p> -->
<script>
// keep slider's value
var val;
// create slider
$("#slider2").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj = $("#slider2").data("roundSlider");
val = obj.getValue();
$.getJSON('/valueofslider', {
slide2_val: val
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide_val: val});
</script>
<div id="slider3"></div>
<!-- <p>Frequency Slider3</p> -->
<script>
// keep slider's value
var val;
// create slider
$("#slider3").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj = $("#slider3").data("roundSlider");
val = obj.getValue();
$.getJSON('/valueofslider', {
slide3_val: val
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide_val: val});
</script>
<div id="slider4"></div>
<!-- <p>Slider4</p> -->
<script>
// keep slider's value
var val;
// create slider
$("#slider4").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj = $("#slider").data("roundSlider");
val = obj.getValue();
$.getJSON('/valueofslider', {
slide4_val: val
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide_val: val});
</script>
<div id="slider5"></div>
<!-- <p>Slider5</p> -->
<script>
// keep slider's value
var val;
// create slider
$("#slider5").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj = $("#slider").data("roundSlider");
val = obj.getValue();
$.getJSON('/valueofslider', {
slide5_val: val
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide_val: val});
</script>
<div id="slider6"></div>
<!-- <p>Slider6</p> -->
<script>
// keep slider's value
var val;
// create slider
$("#slider6").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj = $("#slider").data("roundSlider");
val = obj.getValue();
$.getJSON('/valueofslider', {
slide6_val: val
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide_val: val});
</script>
</body>
</html>'''
# @app.route('/test')
# def test():
# HTML = 'HEAR:'
# for item in (0, 10000, 20000, 25000, 32000):
# HTML += ' <a href="/set/{}">{}</a>'.format(item, item)
# return HTML
# @app.route('/off')
# def off():
# """Turn off sound."""
# sound(0)
# #return jsonify({'val': 0})
# return 'off'
@app.route('/set/<int:value>')
def set_value(value):
"""Set value. Use 0 to turn it off."""
sound(value)
#return jsonify({'val': value})
return str(value)
@app.route('/get')
def get_value():
"""Get value. Returns 0 when turned off."""
if tb:
value = tb.sample_rate
value = tb.amplitude
else:
value = 0
#return jsonify({'val': value})
return str(value)
@app.route('/valueofslider')
def slide():
sample_rate = request.args.get('slide1_val', '32000')
amplitude = request.args.get('slide2_val', '0')
sample_rate = int(sample_rate)
amplitude = int(amplitude)
sound(sample_rate, amplitude)
#return jsonify({'val': sample_rate})
return str(sample_rate)
return str(amplitude)
# def sound_old(sample_rate):
# """version which doesn't use `change()`"""
# global tb
# print('[sound] sample_rate:', sample_rate)
# sample_rate = int(sample_rate)
# # stop old sound
# if tb: # if tb is not None
# tb.stop()
# tb.wait()
# tb = None
# create new sound (if not zero)
if sample_rate > 0 & amplitude == 0:
tb = TopBlock22(sample_rate, amplitude)
tb.start()
def sound(sample_rate, amplitude):
"""version which uses `change()`"""
global tb
print('[sound] sample_rate:', sample_rate)
sample_rate = int(sample_rate)
print('[sound] amplitude:', amplitude)
amplitude = int(amplitude)
if tb: # if tb is not None
if sample_rate > 0 & amplitude == 0 :
tb.change(sample_rate, amplitude)
else:
tb.stop()
tb.wait()
tb = None
# create new sound (if not zero)
if not tb:
if sample_rate > 0 & amplitude == 0:
tb = TopBlock22(sample_rate, amplitude)
tb.start()
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
Update:
from __future__ import print_function
from gnuradio import analog
from gnuradio import audio
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser
class TopBlock22(gr.top_block): # PEP8: CamelCaseName for classes
def __init__(self, sample_rate=32000, amplitude=0):
gr.top_block.__init__(self, "Top Block 22")
##################################################
# Variables
##################################################
self.sample_rate = sample_rate
print('[TopBlock22] __init__: sample_rate:', self.sample_rate)
self.amplitude = amplitude
print('[TopBlock22] __init__: amplitude:', self.amplitude)
##################################################
# Blocks
##################################################
self.blocks_add_xx = blocks.add_vff(1)
self.audio_sink = audio.sink(32000, '', True)
self.analog_sig_source_x_1 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 440, amplitude, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 350, amplitude, 0)
self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN, amplitude, -42)
##################################################
# Connections
##################################################
self.connect((self.analog_noise_source_x_0, 0), (self.blocks_add_xx, 2))
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
self.connect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))
self.connect((self.blocks_add_xx, 0), (self.audio_sink, 0))
def change(self, sample_rate, amplitude=0):
self.sample_rate = sample_rate
print('[TopBlock22] __init__: sample_rate:', self.sample_rate)
self.analog_sig_source_x_1.set_sampling_freq(self.sample_rate)
self.analog_sig_source_x_0.set_sampling_freq(self.sample_rate)
self.amplitude = amplitude
print('[TopBlock22] __init__: amplitude:', self.amplitude)
self.analog_sig_source_x_1.set_amplitude(self.amplitude)
self.analog_sig_source_x_0.set_amplitude(self.amplitude)
self.analog_noise_source_x_0.set_amplitude(self.amplitude)
# lock
self.lock()
# disconect - needs two endpoints (not like in FAQ)
self.disconnect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
self.disconnect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))
# create new
self.analog_sig_source_x_1 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 440, 0.4, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 350, 0.4, 0)
# connect again
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
self.connect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))
# unlock
self.unlock()
# -----------------------------------------------------------------------------
from flask import Flask, request, jsonify
app = Flask(__name__)
tb = None # global variable to keep it between requests
@app.route('/')
def index():
return '''<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>GNURadio Slider Example</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/roundSlider/1.3.2/roundslider.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/roundSlider/1.3.2/roundslider.min.js"></script>
</head>
<body>
<style>
#slider1 {
position:absolute;
top:100px;
left:75px;
align:center;
}
#slider2 {
position:absolute;
top:100px;
left:470px;
align:center;
}
#slider3 {
position:absolute;
top:100px;
left:870px;
align:center;
}
#slider4 {
position:absolute;
top:450px;
left:75px;
align:center;
}
#slider5 {
position:absolute;
top:450px;
left:470px;
align:center;
}
#slider6 {
position:absolute;
top:450px;
left:870px;
align:center;
}
</style>
</head>
<body>
<div id="slider1"></div>
<!-- <p>Sample Rate Slider</p> -->
<script>
// keep slider's value
var val1;
// create slider
$("#slider1").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj1 = $("#slider1").data("roundSlider");
val1 = obj1.getValue();
$.getJSON('/valueofslider', {
slide1_val1: val1
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide1_val: val1});
</script>
<div id="slider2"></div>
<!-- <p>Amplitude Slider2</p> -->
<script>
// keep slider's value
var val2;
// create slider
$("#slider2").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj2 = $("#slider2").data("roundSlider");
val2 = obj2.getValue();
$.getJSON('/valueofslider', {
slide2_val2: val2
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide2_val: val2});
</script>
<div id="slider3"></div>
<!-- <p>Frequency Slider3</p> -->
<script>
// keep slider's value
var val3;
// create slider
$("#slider3").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj3 = $("#slider3").data("roundSlider");
val3 = obj3.getValue();
$.getJSON('/valueofslider', {
slide3_val3: val3
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide3_val: val});
</script>
<div id="slider4"></div>
<!-- <p>Slider4</p> -->
<script>
// keep slider's value
var val4;
// create slider
$("#slider4").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj4 = $("#slider").data("roundSlider");
val4 = obj4.getValue();
$.getJSON('/valueofslider', {
slide4_val4: val4
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide4_val: val});
</script>
<div id="slider5"></div>
<!-- <p>Slider5</p> -->
<script>
// keep slider's value
var val5;
// create slider
$("#slider5").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj5 = $("#slider").data("roundSlider");
val5 = obj5.getValue();
$.getJSON('/valueofslider', {
slide5_val5: val5
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide5_val: val});
</script>
<div id="slider6"></div>
<!-- <p>Slider6</p> -->
<script>
// keep slider's value
var val;
// create slider
$("#slider6").roundSlider({
radius: 150,
min: 0,
max: 10000000000,
value: 0, // default value at start
change: function () {
var obj6 = $("#slider").data("roundSlider");
val6 = obj6.getValue();
$.getJSON('/valueofslider', {
slide6_val6: val6
});
}
});
// play sound at start
$.getJSON('/valueofslider', {slide6_val: val});
</script>
</body>
</html>'''
@app.route('/set/<int:value>')
def set_value(value):
"""Set value. Use 0 to turn it off."""
sound(value)
#return jsonify({'val': value})
return str(value)
@app.route('/get')
def get_value():
"""Get value. Returns 0 when turned off."""
if tb:
value = tb.sample_rate
value = tb.amplitude
else:
value = 0
#return jsonify({'val': value})
return str(value)
@app.route('/valueofslider')
def slide():
sample_rate = request.args.get('slide1_val1', '32000')
sample_rate = int(sample_rate)
return str(sample_rate)
if sample_rate > 0:
tb = TopBlock22(sample_rate)
tb.start()
def slide():
amplitude = request.args.get('slide2_val2', '0')
amplitude = int(amplitude)
sound(sample_rate, amplitude)
return str(amplitude)
if amplitude == 0:
tb = TopBlock22(amplitude)
tb.start()
def sound(sample_rate, amplitude):
"""version which uses `change()`"""
global tb
print('[sound] sample_rate:', sample_rate)
sample_rate = int(sample_rate)
print('[sound] amplitude:', amplitude)
amplitude = int(amplitude)
if tb: # if tb is not None
if sample_rate > 0 & amplitude == 0 :
tb.change(sample_rate, amplitude)
else:
tb.stop()
tb.wait()
tb = None
# create new sound (if not zero)
if not tb:
if sample_rate > 0 & amplitude == 0:
tb = TopBlock22(sample_rate, amplitude)
tb.start()
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')