wbserver roundSlider 小部件不启动/更新音频程序 [英] wbserver roundSlider widget doesn't start/update audio tone program
问题描述
我有一个导入到 Falsk 网络服务器的拨号音"python 程序,我有一个嵌入 html 的 roundSlider 小部件,我试图用它来更新拨号音程序中的采样率变量值.一旦我运行网络服务器并开始拖动滑块,在拖动时滑块的值在视觉上会更新/更改,但是没有提示音,提示音程序没有启动!
I have a "dial tone" python program that is imported into a Falsk webserver, and I have an html embedded roundSlider widget that I am trying to use to update the sample rate variable values inside dial tone program. Once I run the webserver and start dragging the slider, visually the value of the slider does update/change when dragging it, but there is no tone, the tone program doesn't start!
拜托,我需要你的帮助来解决这个问题.
Please, I need your help to figure this out.
这是我的烧瓶 app.py:
Here is my flask app.py:
from flask import Flask, render_template, jsonify, request,redirect,url_for
from random import randint
from top_block_22 import top_block_22
app = Flask(__name__)
# def test():
# print("its working")
@app.route('/')
def slide_func():
return render_template("index.html")
print(slide_val)
return(slide_val)
def test():
print("its working")
@app.route('/valueofslider')
def slide():
slide_val = request.args.get('slide_val')
return main(slide_val)
def main(slide_val):
tb = top_block_22()
tb.start()
samp_rate = int(slide_val) + 100
print(samp_rate)
return(slide_val)
app.debug = True
if __name__ == '__main__':
app.run(debug=True)
主拨号音代码:
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
from flask import Flask, render_template, jsonify, request, redirect, url_for
from random import randint
#from app import *
class top_block_22(gr.top_block):
def __init__(self, samp_rate):
gr.top_block.__init__(self, "Top Block 22")
##################################################
# Variables
##################################################
self.samp_rate = samp_rate = 32000
##################################################
# 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(samp_rate, analog.GR_COS_WAVE, 440, 0.4, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 350, 0.4, 0)
self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN, 0.005, -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 main(top_block_cls=top_block_22, options=None):
tb = top_block_22('samp_rate')
tb.start()
try:
raw_input('Press Enter to quit: ')
except EOFError:
pass
tb.stop()
tb.wait()
if __name__ == '__main__':
main()
index.html 脚本:
index.html script:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jQuery roundSlider - JS Bin</title>
<link rel="icon" href="data:,">
<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>
<!-- Only html needed -->
<form class="form-inline" method="POST" action="{{ url_for('slide') }}">
<div id="slider"></div>
<script>
var val;
$("#slider").roundSlider({
radius: 215,
min: 0,
max: 100000,
change: function () {
var obj1 = $("#slider").data("roundSlider");
val = obj1.getValue();
value: 10
$.getJSON('/valueofslider', {
slide_val: val
});
}
});
</script>
</body>
</html>
这是滑块更新其值时的图像:
Here is an image of the slider when its updating its values:
推荐答案
此代码对我有用.
主要问题是函数运行速度太快以至于没人能听到声音 - 所以我添加了 time.sleep(0.5)
Main problem was that function runs so fast that nobody can hear sound - so I added time.sleep(0.5)
我将所有代码放在一个文件中,这样可以更轻松地复制并粘贴到文件中以运行它.
I put all code in one file so it is easier to copy and paste to file to run it.
主页 http://localhost:5000/
显示几个具有不同值的链接来测试它.
Main page http://localhost:5000/
displays few links with different values to test it.
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 top_block_22(gr.top_block):
def __init__(self, samp_rate=32000): # default value for samp_rate
gr.top_block.__init__(self, "Top Block 22")
##################################################
# Variables
##################################################
self.samp_rate = samp_rate # without "= 32000"
print('[DEBUG] top_block_22:', self.samp_rate)
##################################################
# 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(samp_rate, analog.GR_COS_WAVE, 440, 0.4, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 350, 0.4, 0)
self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN, 0.005, -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))
# -----------------------------------------------------------------------------
from flask import Flask, request
#from top_block_22 import top_block_22
import time
app = Flask(__name__)
@app.route('/')
def index():
HTML = 'HEAR:'
for item in (20000, 25000, 32000):
HTML += ' <a href="/valueofslider?slide_val={}">{}</a>'.format(item, item)
return HTML
@app.route('/valueofslider')
def slide():
slide_val = request.args.get('slide_val', 32000) # default value 32000
main(slide_val)
return slide_val
def main(slide_val):
samp_rate = int(slide_val) + 100
print('[DEBUG] main:', samp_rate)
tb = top_block_22(samp_rate) # run with value from variable
tb.start()
time.sleep(0.5)
tb.stop()
tb.wait()
if __name__ == '__main__':
app.run(debug=True)
<小时>
此版本显示滑块,它使用 Thread
始终播放声音(在选择滑块上的第一个值后).
This version displays slider and it uses Thread
to play sound all time (after selecting first value on slider).
当滑块发送新值时,它会停止旧线程并使用新的 samp_rate
创建新线程.
When slider sends new value then it stops old thread and creates new one with new samp_rate
.
但也许可以不用 Thread
而只使用 tb.start
、tb.stop
等来完成.看起来 top_block_22
已经使用线程来工作了.
But maybe it can be done without Thread
but using only tb.start
, tb.stop
, etc. It seems top_block_22
already uses thread to work.
它还使用 http://localhost:5000/off
发送 samp_rate=0
停止声音.
It also uses http://localhost:5000/off
to send samp_rate=0
which stop sound.
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 top_block_22(gr.top_block):
def __init__(self, samp_rate):
gr.top_block.__init__(self, "Top Block 22")
##################################################
# Variables
##################################################
self.samp_rate = samp_rate
print('[DEBUG] top_block_22:', self.samp_rate)
##################################################
# 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(samp_rate, analog.GR_COS_WAVE, 440, 0.4, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 350, 0.4, 0)
self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN, 0.005, -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))
# -----------------------------------------------------------------------------
from threading import Thread
class MyThread(Thread):
def __init__(self, samp_rate):
Thread.__init__(self)
self.running = True
self.samp_rate = samp_rate
def run(self):
tb = top_block_22(self.samp_rate)
tb.start()
while self.running:
time.sleep(0.5) # need it to head sound
tb.stop()
tb.wait()
# -----------------------------------------------------------------------------
from flask import Flask, request
#from top_block_22 import top_block_22
import time
app = Flask(__name__)
my_thread = None
@app.route('/')
def index():
return '''<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jQuery roundSlider - JS Bin</title>
<link rel="icon" href="data:,">
<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>
<!-- Only html needed -->
<form class="form-inline" method="POST" action="{{ url_for('slide') }}">
<div id="slider"></div>
<script>
var val;
$("#slider").roundSlider({
radius: 215,
min: 0,
max: 100000,
change: function () {
var obj1 = $("#slider").data("roundSlider");
val = obj1.getValue();
value: 10
$.getJSON('/valueofslider', {
slide_val: val
});
}
});
</script>
</body>
</html>'''
@app.route('/off')
def off():
'''use `slide_val=0` to turn it off'''
main(0)
return 'off'
@app.route('/valueofslider')
def slide():
slide_val = request.args.get('slide_val', 32000)
main(slide_val)
return slide_val
def main(slide_val):
global my_thread
print('[DEBUG] main:', slide_val)
samp_rate = int(slide_val)
if my_thread: # if my_thread is not None
my_thread.running = False
my_thread.join()
my_thread = None
if samp_rate > 0:
my_thread = MyThread(samp_rate)
my_thread.start()
if __name__ == '__main__':
app.run(debug=True)
<小时>
没有Thread
的版本.
和之前一样,它显示滑块并在选择第一个值后一直播放声音.它使用全局值 tb
来保持对对象的访问,并在它获得新的 samp_rate
时停止它,并运行新对象.
As before it display slider and it play sound all time after selecting first value. It use global value tb
to keep access to object and stop it when it get new samp_rate
, and run new object.
它还使用 http://localhost:5000/off
发送 samp_rate=0
停止声音.
It also uses http://localhost:5000/off
to send samp_rate=0
which stop sound.
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 top_block_22(gr.top_block):
def __init__(self, samp_rate):
gr.top_block.__init__(self, "Top Block 22")
##################################################
# Variables
##################################################
self.samp_rate = samp_rate
print('[DEBUG] top_block_22:', self.samp_rate)
##################################################
# 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(samp_rate, analog.GR_COS_WAVE, 440, 0.4, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 350, 0.4, 0)
self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN, 0.005, -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))
# -----------------------------------------------------------------------------
from flask import Flask, request
#from top_block_22 import top_block_22
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>jQuery roundSlider - JS Bin</title>
<link rel="icon" href="data:,">
<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>
<!-- Only html needed -->
<form class="form-inline" method="POST" action="{{ url_for('slide') }}">
<div id="slider"></div>
<script>
var val;
$("#slider").roundSlider({
radius: 215,
min: 0,
max: 100000,
change: function () {
var obj1 = $("#slider").data("roundSlider");
val = obj1.getValue();
value: 10
$.getJSON('/valueofslider', {
slide_val: val
});
}
});
</script>
</body>
</html>'''
@app.route('/off')
def off():
'''use `slide_val=0` to turn it off'''
main(0)
return 'off'
@app.route('/valueofslider')
def slide():
slide_val = request.args.get('slide_val', 32000)
main(slide_val)
return slide_val
def main(slide_val):
global tb
print('[DEBUG] main:', slide_val)
samp_rate = int(slide_val)
# stop old sound
if tb: # if tb is not None
tb.stop()
tb.wait()
tb = None
# create new sound (if not zero)
if samp_rate > 0:
tb = top_block_22(samp_rate)
tb.start()
if __name__ == '__main__':
app.run(debug=True)
<小时>
最新版本
JavaScript 中的一些变化:
Few changes in JavaScript:
- 它在开始时设置了默认值 - 32000.JS 中有错误.
- 它在开始时发送请求,因此在加载页面后它会发出声音.无需在滑块上选择值.
Python 中的变化:
Changes in Python:
- 建议 PEP 8 -- Python 代码风格指南为类设置
UpperCaseName
-TopBlock22
- 将
main
重命名为sound
以更好地描述函数在做什么 http://localhost/set/
设置采样率,因此可以使用它代替http://localhost/valueofslider?slider_val=
代码>. http://localhost/get
获取当前采样率http://localhost/off
将值设置为 0 以关闭声音.当它太烦人时,我用它来快速关闭声音.print_function
来自__future__
以使用print(text)
就像在 Python 3 中一样- 函数以文本形式返回值,但有带有
jsonify()
的行,因此它们可以将其重新调整为 JSON.也许以后会有用.
- as suggest PEP 8 -- Style Guide for Python Code I set
UpperCaseName
for class -TopBlock22
- renamed
main
tosound
which better describe what function is doing http://localhost/set/<value>
sets sample rate so it can be used instead ofhttp://localhost/valueofslider?slider_val=<value>
.http://localhost/get
gets current sample ratehttp://localhost/off
sets value to 0 so it turns off sound. I used it to fast turn off sound when it was too annoying.print_function
from__future__
to useprint(text)
like in Python 3- functions return value as text but there are lines with
jsonify()
so they can retun it as JSON. Maybe it can be useful later.
在 FAQ
中,我发现了 如何重新配置流程图?我如何使用 lock()、unlock()? 所以也许它可以在不创建新对象的情况下改变采样率,也许它可以提供更好的声音.当它改变采样率时,我会点击.
In FAQ
I found How can I reconfigure a flow graph? How do I use lock(), unlock()? so maybe it can change sample rate without creating new object and maybe it gives better sound. I head click when it change sample rate.
代码:
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):
gr.top_block.__init__(self, "Top Block 22")
##################################################
# Variables
##################################################
self.sample_rate = sample_rate
print('[TopBlock22] sample_rate:', self.sample_rate)
##################################################
# 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, 0.4, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 350, 0.4, 0)
self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN, 0.005, -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))
# -----------------------------------------------------------------------------
from flask import Flask, request, jsonify
#from top_block_22 import TopBlock22
import time
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>
<div id="slider"></div>
<script>
// keep slider's value
var val;
// create slider
$("#slider").roundSlider({
radius: 215,
min: 0,
max: 100000,
value: 32000, // default value at start
change: function () {
var obj = $("#slider").data("roundSlider");
val = obj.getValue();
$.getJSON('/valueofslider', {
slide_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 current value."""
if tb:
value = tb.sample_rate
else:
value = 0
#return jsonify({'val': value})
return str(value)
@app.route('/valueofslider')
def slide():
sample_rate = request.args.get('slide_val', '32000')
sample_rate = int(sample_rate)
sound(sample_rate)
#return jsonify({'val': sample_rate})
return str(sample_rate)
def sound(sample_rate):
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:
tb = TopBlock22(sample_rate)
tb.start()
if __name__ == '__main__':
app.run(debug=True)
<小时>
这次是最后一个版本.
它使用lock/unlock
和disconnect/connect
来改变声音而不创建新对象.基于常见问题解答中的示例(如何重新配置流程图?我如何使用lock()、unlock()?) 但是disconnect
需要两个端点,例如connect
.
It uses lock/unlock
and disconnect/connect
to change sound without creating new object. Based on example from FAQ (How can I reconfigure a flow graph? How do I use lock(), unlock()?) but disconnect
needed two endpoints like connect
.
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):
gr.top_block.__init__(self, "Top Block 22")
##################################################
# Variables
##################################################
self.sample_rate = sample_rate
print('[TopBlock22] __init__: sample_rate:', self.sample_rate)
##################################################
# 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, 0.4, 0)
self.analog_sig_source_x_0 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 350, 0.4, 0)
self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN, 0.005, -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):
self.sample_rate = sample_rate
print('[TopBlock22] change: sample_rate:', self.sample_rate)
# 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>
<div id="slider"></div>
<script>
// keep slider's value
var val;
// create slider
$("#slider").roundSlider({
radius: 215,
min: 0,
max: 100000,
value: 32000, // default value at start
change: function () {
var obj = $("#slider").data("roundSlider");
val = obj.getValue();
$.getJSON('/valueofslider', {
slide_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
else:
value = 0
#return jsonify({'val': value})
return str(value)
@app.route('/valueofslider')
def slide():
sample_rate = request.args.get('slide_val', '32000')
sample_rate = int(sample_rate)
sound(sample_rate)
#return jsonify({'val': sample_rate})
return str(sample_rate)
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:
tb = TopBlock22(sample_rate)
tb.start()
def sound(sample_rate):
"""version which uses `change()`"""
global tb
print('[sound] sample_rate:', sample_rate)
sample_rate = int(sample_rate)
# change or stop old sound
if tb: # if tb is not None
if sample_rate > 0:
tb.change(sample_rate)
else:
tb.stop()
tb.wait()
tb = None
# create new sound (if not zero)
if not tb:
if sample_rate > 0:
tb = TopBlock22(sample_rate)
tb.start()
if __name__ == '__main__':
app.run(debug=True)
<小时>
我发现采样率
可以用
self.analog_sig_source_x_1.set_sampling_freq(sample_rate)
所以它不必创建新的 sig_source_f
class TopBlock22(gr.top_block):
# ... rest ...
def change(self, sample_rate):
self.sample_rate = sample_rate
print('[TopBlock22] change: sample_rate:', self.sample_rate)
self.analog_sig_source_x_1.set_sampling_freq(sample_rate)
self.analog_sig_source_x_0.set_sampling_freq(sample_rate)
我认为现在当它改变 sample rate
时我听不到点击,但现在我填充它在鼠标点击后改变它之前有很小的延迟.
I think that now I don't hear clicks when it changes sample rate
but now I fill it has small delay before it change it after mouse click.
要查看此对象中的其他功能,您可以使用 dir(self.analog_sig_source_x_1)
To see other functions in this object you can use dir(self.analog_sig_source_x_1)
print('\n'.join(dir(self.analog_sig_source_x_1)))
...
set_amplitude
set_block_alias
set_frequency
set_max_noutput_items
set_max_output_buffer
set_min_noutput_items
set_min_output_buffer
set_offset
set_processor_affinity
set_sampling_freq
set_thread_priority
set_waveform
...
这篇关于wbserver roundSlider 小部件不启动/更新音频程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!