SDL-Mixer 音频在启动 Reactive-Banana 输入循环时停止

2024-03-30

我一直在开发一款使用多个音轨的游戏,其音量根据鼠标运动实时调整。我一般使用 SDl-Mixer 来处理音频,使用 Reactive-Banana 来处理游戏。问题是,一开始就开始播放的曲目在输入循环开始时停止播放。原因可能是其他原因,但我想知道 SDL 和 Reactive-Banana 之间是否存在一些我不明白的奇怪交互。一段时间以来,我一直试图解决这个问题,但这可能只是我忽略的一些简单的事情。提前致谢。这是一个简单测试的代码:

import Reactive.Banana
import Graphics.UI.SDL
import Graphics.UI.SDL.Mixer
import Control.Monad

musicdir = "/home/silas/code/haskell/river/audio/"

testNet :: AddHandler (Int,Int,[MouseButton]) -> NetworkDescription t ()
testNet mouseHdlr = do
  eMouse <- fromAddHandler mouseHdlr
  reactimate $ (putStrLn . show) <$> eMouse

main = withInit [InitEverything] $ do
         setVideoMode 100 100 32 [SWSurface]
         openAudio defaultFrequency AudioS16Sys 1 1024
         allocateChannels 1
         chunk <- loadWAV $ musicdir ++ "guitar1" ++ ".ogg"
         playChannel 0 chunk (-1)
         (mouseHdlr, mouseAction) <- newAddHandler
         net <- compile $ testNet mouseHdlr
         actuate net
         forever $ getMouseState >>= mouseAction

编辑:问题似乎不一定在于反应性香蕉。任何类型的“永远”循环都会导致音频停止。


这可能不是你的问题,但当我遇到类似的问题时,垃圾收集器无法判断我仍在使用 SDL 音频块(因为只有 SDL 正在使用它)并从 SDL 下释放 RAM 。为了解决这个问题,你不仅必须确保该项目在 SDL 使用它的整个过程中都在范围内,而且你的 Haskell 代码实际上以某种方式使用它(这样优化器就不会改变它)你)。打电话就像touchForeignPtr对此非常有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SDL-Mixer 音频在启动 Reactive-Banana 输入循环时停止 的相关文章

  • 为什么将 volatile 与同步块一起使用?

    我在java中看到了一些示例 其中他们在代码块上进行同步以更改某些变量 而该变量最初被声明为易失性 我在单例类的示例中看到 他们将唯一实例声明为易失性 并且同步了该块初始化该实例 我的问题是为什么我们在同步它时声明它是易失性的 为什么我们需
  • 如何处理“恐慌:不可能的事情发生了”并在 Haskell 中继续

    我有以下代码 它使用 GHC API 加载模块并获取表达式的类型 typeObjects String gt String gt IO Type typeObjects modules objects do defaultErrorHand
  • 具有阻塞功能的 Twisted LoopingCall

    我有一个应用程序需要轮询数据库以了解可能的配置更改 该应用程序是一个使用 Twisted 的简单 xmlrpc 服务器 我尝试过使用Twisted的LoopingCall来执行轮询 但是由于LoopingCall在主线程上运行 所以对db的
  • Android SurfaceView 使用线程绘制画布

    我正在尝试使用线程在画布上绘图来创建一个简单的游戏引擎 但我遇到了一些无法解释的奇怪问题 这个 游戏 的目的是每秒在画布上画一个圆圈 这是可行的 但不是我想要的工作方式 似乎应用程序正在两个画布之间切换 并向每个画布添加一个圆圈 这样您就可
  • 解析 PHOAS 表达式

    我想我理解 PHOAS 参数化高阶抽象语法 我明白了如何漂亮地打印一个表达式 参见http www reddit com r haskell comments 1mo59h phoas for free by edward kmett cc
  • 原始类型是易失性的还是同步的?

    在 Java 中 如果变量的大小小于或等于 32 位 则赋值是原子的 但如果变量的大小大于 32 位 则赋值不是原子的 在双重或长分配的情况下 使用什么 易失性 同步 会更有效 Like volatile double x y 同步不适用于
  • 有没有办法在 Emacs 中使用 Djinn 自动生成 Haskell 代码?

    标题几乎说明了一切 我正在寻找这样的东西 f Int gt Bool gt Int f body Djinn 可以使用定理证明来通过证明该类型存在来生成此类函数的代码 我想知道 是否有现有的方法可以从 Emacs 中获取此功能 因此 我不需
  • 什么是阴谋地狱?

    在阅读有关 阴谋地狱 的内容时 我有点困惑 因为这个词的含义太多了 我猜最初 Cabal Hell 指的是钻石依赖问题 该问题是通过限制构建计划在每个构建计划中只有任何包的单个版本来解决的 一个包的两个不同版本不能存在于单个构建计划中 正如
  • 有什么方法可以在 do / while / let 块中打印出变量的类型吗?

    有没有办法打印出嵌套变量的推断类型ghci 考虑代码 let f g where g x Int x 那么 最好查询一下类型g e g t f g会打印出Int gt Int 您可以通过给出适当的错误类型注释并检查错误消息来诱骗此信息 Ma
  • 如何在c#中指定时间后取消后台工作者

    如何在 C 中的指定时间后取消后台工作程序或取消无响应的后台工作程序 看看这个教程 http www albahari com threading part3 aspx http www albahari com threading par
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 为什么解析器组合器“seq”用“bind”和“return”定义?

    我正在读这个article http eprints nottingham ac uk 237 1 monparsing pdf关于解析器组合器并且不理解以下内容 他们说使用seq 见下文 导致解析器将嵌套元组作为结果 操作起来很混乱 se
  • iPhone 应用程序中的异步、同步、线程

    我正处于一个应用程序的设计阶段 该应用程序将利用 REST Web 服务 并且在使用异步 同步和线程方面遇到了困境 这是场景 假设您有三个选项可供深入研究 每个选项都有自己的基于 REST 的资源 我可以使用同步请求延迟加载每个请求 但这会
  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 我们可以使用 x86_64 CPU 原子在 PCI Express 上生成复合原子操作吗?

    如您所知 从2 0版本开始 PCI Express支持复合原子操作 FetchAdd Swap CAS https pcisig com sites default files specification documents ECN Ato
  • 为什么 GetThreadTimes 返回

    我试图测量线程中花费的时间以用于进度报告目的 但我从 GetThreadTimes 系统调用中得到非常奇怪的结果 给出以下程序 在 VS 2013 中编译 针对 NET 4 5 using System using System Diagn
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • C++ AMP 目前的状况如何

    我正在使用 C 编写高性能代码 并且一直在使用 CUDA 和 OpenCL 最近还使用我非常喜欢的 C AMP 然而 我有点担心它没有得到发展和扩展 并且会消亡 让我产生这个想法的是 即使是 MS C AMP 博客也已经沉默了大约一年 查看
  • Windows 上 JavaFX 的 Gluon 客户端 Maven 插件无法编译?

    我一直在 Windows 机器上为我的一个项目试验 Gluon 的客户端 Maven 插件 我决定尝试一下他们的 hello world 示例之一 here https github com gluonhq client samples我遵
  • 如何访问变量的原始值

    假设我有这个代码 public static long number public static void main String args String str1 args 0 System out println str1 is str
  • 升级到 Cordova 5.0 + [电子邮件受保护] 后,Ajax 请求失败

    我最近升级到 Cordova 5 0 和 Cordova Android 4 0 从那时起 我的应用程序无法再访问外部资源 我还有
  • 使用 Scala 3 宏重写方法

    我正在尝试使用 Scala 3 宏和 TASTY 重写方法 我想重写任何类型的任何方法 现在我从这个简单的案例开始 我有一个测试基类 class TestClass def func s String base 我想实现这一点 但使用 TA
  • 需要 Django 表单帮助

    我是 django 新手 正在尝试制作一个几乎不需要验证的用户注册表单 除此之外 我还想要一个用户名建议代码 它将告诉用户他尝试注册的用户名是否可用或已在使用中 然后它应该给出一些可供选择的建议 任何可能从事过相同或相似项目的人都可以帮助我
  • 以编程方式将 boxBackgroundMode 设置为 TextInputLayout

    我刚刚迁移自com android support 设计 to com google android material implementation androidx appcompat appcompat 1 1 0 implementa
  • 设计时的 Windows 应用商店应用 ResourceLoader

    我已经开始为 Windows 8 1 创建 Windows 应用商店应用程序 现在遇到了有关本地化的问题 我想在设计时显示 resw 文件中的字符串资源 但每次尝试都失败了 即使它在运行时有效 使用 x Uid 属性时 我仍然必须提供 Te
  • 动态创建 jCheckBox 并添加到 jScrollPane

    编辑 使用下面提供的解决方案 我更改了代码以在 JScrollPane 中包含 JPanel 使用 JButton 我将 JCheckBox 添加到 JScrollPane 内的 JPanel 这是一个已解决的问题 因为 JScrollPa
  • 不兼容的库版本:安装 R 包时 libtk8.6.dylib 需要 ...

    我正在尝试安装 R 包 ggplot2 尽管我收到的错误似乎与该特定包无关 我正在 Mac OSX 10 6 8 上运行 错误消息位于该消息的底部 发生的事情是 我打开 R 并输入install packages ggplot2 键入此内容
  • C++ 中的 std::string 是否有一个内置函数,可以在字符串可以是大写或小写时按字母顺序比较两个字符串?

    我知道对于 C 如果两个单词都完全小写或完全大写 基本比较运算符就可以完成任务 我有一个字符串数组 字母可以从小到大变化 这是我可以使用的字符串类型的一个小示例 丰富的生活CH 新生活WMN MNSTRY 新生命集会 我知道Java中有这个
  • 相同投影矩阵的不同基本矩阵

    我使用两个投影矩阵 P1 和 P2 例如我使用恐龙数据集 http www robots ox ac uk 7Evgg data1 html 并且我需要计算基本矩阵 F 所以我使用两个Matlab函数 彼得 科维西的函数 www csse
  • 如何编译Freetype(2)和Harfbuzz(使用Visual Studio)以使它们协同工作?

    我找到了关于编译与 Harfbuzz 相关的 Freetype 的已知问题的良好文档 http www gregwessels com dev 2017 05 02 freetype harfbuzz html http www gregw
  • 在 Angular 控制器中使用下划线

    如何在 angularjs 控制器中使用下划线库 在这篇文章中 AngularJS limitTo 按最后 2 条记录 https stackoverflow com questions 11943130 angularjs limitto
  • Google Glass 可以使用英语以外的语言进行搜索吗?

    我浏览了网络 没有找到任何有关 Google Glass 是否具有英语以外其他语言的语音识别功能的信息 例如 Google Now 对瑞典语有很好的工作认可 还是我需要自己实现一些第三方识别 如果 Google Glass 团队中的任何人有
  • 如何获取 MIDI 设备的当前状态?

    如何查询 MIDI 设备当前的程序状态 音量等 我试图在 Midi 规格中找到它 但没有成功 我基本上需要从通过 USB midi 连接的数码钢琴获取当前乐器 钢琴等 Java似乎可以做到 http docs oracle com java
  • css斑马条纹背景无图像

    可以使用CSS将斑马条纹作为背景而不使用图像吗 是的 你可以 用类似的东西 ul li background color fff ul li nth child even background color efefef See http r
  • MVVCross:将枚举值作为 Android 的 CommandParameter 传递

    我想将枚举值作为命令参数传递 我的枚举定义为 public enum MyEnum One Two 在我的 axml 中我有 local MvxBind Click MyCommand CommandParameter MyEnum One
  • 在 Vue.js 中隐藏组件

    有没有办法可以控制共享组件在另一个组件中的渲染 我有一个组件 它是一个底部栏 需要在一些具体组件中禁用 不渲染 我正在所有组件都使用的模板中渲染底部栏 编辑 我正在使用 webpack 正如罗伊所说 您可以拥有一个属性来调节组件的渲染 假设
  • SDL-Mixer 音频在启动 Reactive-Banana 输入循环时停止

    我一直在开发一款使用多个音轨的游戏 其音量根据鼠标运动实时调整 我一般使用 SDl Mixer 来处理音频 使用 Reactive Banana 来处理游戏 问题是 一开始就开始播放的曲目在输入循环开始时停止播放 原因可能是其他原因 但我想