首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Raspberry Pi上的流调频收音机,改变频率而不重新启动

Raspberry Pi上的流调频收音机,改变频率而不重新启动
EN

Stack Overflow用户
提问于 2017-07-12 03:57:11
回答 1查看 901关注 0票数 0

我正在播放FM收音机,并试图改变我的Raspberry Pi 3的RTL-SDR的频率,同时播放(即不必关闭程序并重新启动)。

它现在播放电台,我可以慢慢地增加电台/频率。然而,如果我增长过快,特别提款权就会停止播放。

我在用:

  • Raspberry Pi 3,用Python2.7.9编写
  • NooElec R820T SDR & DVB-T USB接口
  • 旋转编码器输入所需频率
  • pi编码器
  • 调频接收,sox播放

我的代码是:

代码语言:javascript
复制
import os
import time
import subprocess

from pi_encoder import *

def updateStation(station_addr, kill=0):
    print 'creating pipe1a'
    pipe1a = subprocess.Popen(['rtl_fm', '-M', 'wbfm', '-f', str(station_addr) + 'M', '-g', '10'], stdout=subprocess.PIPE)
    print 'creating pipe1b'
    pipe1b = subprocess.Popen(['play', '-r', '32k', '-t', 'raw', '-e', 's', '-b', '16', '-c', '1', '-V1', '-'], stdin=pipe1a.stdout, stdout=subprocess.PIPE)
    print 'creating pipe1c'
    pipe1c = pipe1b.stdout

    pid_a = pipe1a.pid
    return pid_a, pipe1a

# Export LD_LIBRARY_PATH; doesn't seem to retain
os.system('export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib')

## Rotary encoder GPIO PIN assignments are set in 'pi_encoder' module

## SET INITIAL VALUES
tuner_value = 0
station_addr = 95.1
max_tuner_addr = 109.1
min_tuner_addr = 88.0

## INITIALIZE ROTARY ENCODER WORKER THREAD
tuner_encoder = EncoderWorker(SwitchEncoder(TUNER_CLK_PIN, TUNER_DT_PIN, TUNER_SW_PIN))
tuner_encoder.start()

## MAIN LOOP
try:
    print 'Starting main loop'
    pid, process = updateStation(station_addr)
    while True:
        delta_tuner = tuner_encoder.get_delta()

        if delta_tuner!=0:
            tuner_value = tuner_value + delta_tuner
            print "tuner value", tuner_value
            station_addr = station_addr + (delta_tuner/10.0)
            if station_addr > max_tuner_addr:
                station_addr = max_tuner_addr
            elif station_addr < min_tuner_addr:
                station_addr = min_tuner_addr
            print 'station_address: ', station_addr

            print 'terminating process:'
            process.terminate()
            try:
                os.kill(pid, 0)
                process.kill()
            except OSError, e:
                print 'Terminated gracefully'

            pid, process = updateStation(station_addr)

        if tuner_encoder.get_upEvent():
            print "tuner up!"

        if tuner_encoder.get_downEvent():
            print "tuner down!"

finally:
    print 'Cleaning up GPIO...'
    IO.cleanup()

python子进程是否允许这种使用?

还有另一种方式(命令、方法、库),允许更平稳、更快地改变电台/频率,而不会影响或阻止特别提款权的播放?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-13 15:32:57

在使用process.kill调用启动新进程之前,您可能需要找到一种方法,等待process.kill()完成,管道关闭(异步发生)。尝试在任何杀死之后在主while()循环中添加一个小延迟,以防止它发送比操作系统可靠处理的更快的进程命令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45048152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档