问题标签 [libretro]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 来自 libretro 使用 libao 的生涩声音
我正在尝试使用 SFML 用于图形、libao 用于声音和 Qt 框架的某些部分在 C++ 中创建一个小型 libretro 前端。
逻辑如下:使用 SFML 的内置时钟系统,我以给定的节奏在每一帧刷新 libretro 核心。然后核心首先轮询输入,并为我提供生成帧的视频和音频输出。
问题在于音频:每一帧,核心都给我足够的音频来匹配它的采样率(例如,对于 SNES,它是每秒 32000 个样本)。所以,每次我收到音频回调时,我只是ao_play
用来播放所有需要的东西。
这是在每一帧运行的代码;我已经使用核心给出的参数初始化了 libao:有符号的 16 位整数、良好的采样率和 2 个通道。
但结果非常不稳定,就像每帧之间存在一些延迟一样。声音很准确,但听起来质量很差,输出很差。我被告知我需要一个更强大的声音实现,这是什么意思?我需要重新采样声音,还是制作外螺纹?
谢谢 !
audio - 我有音频样本;如何使用 SDL 正确播放它们?
我正在为libretro核心编写一个非常简单的前端,并且我正在攻击音频部分,这是最难的(我以前从未处理过任何与声音相关的事情,所以我很可能完全错了)。
它的工作方式是,libretro 核心定期调用一个原型函数,因为我必须自己实现:
data
参数是隔行扫描立体数据的数组(){ Left, Right, Left, ...}
,count
是样本数(所以数组元素计数实际上是count * 2)。
这是我目前对这些数据所做的事情:
- 当 libretro 核心向我发送样品时
- 我只是将它们连接到音频缓冲区
- 当 SDL 调用我的音频回调方法时,
- 我从音频缓冲区复制尽可能多的请求和可用到流缓冲区
- 如果没有足够的数据可用,我用 0 填充流缓冲区的其余部分
- 如果我的缓冲区的数据比请求的多,我只需删除我刚刚播放的内容并保留其余部分
但是,我得到的不正确。尽管有些可辨认,但声音却是乱码,充满了噪音。我不确定我可能缺少什么:似乎 RetroArch 前端(libretro 核心的官方前端)正在进行某种重新采样,但我不知道它是什么。是否需要重新采样?我的问题可以来自那里吗?
这是我的完整代码,部分转载如下:
c# - 如何将 int16 声音样本数组转换为字节数组以在 MonoGame/XNA 中使用
我正在用 C#/MonoGame 编写一个 libretro 前端,我已经设法获得了一个粗糙(但有效)的视频 blitter,但现在我正在努力解决声音问题。
从 API:
因此,样本是有符号的 16 位整数。我正在尝试像这样使用 Stream 中的 SoundEffect:
我得到了声音,声音模式清晰可辨,但它是乱码,你看到我的实现有什么问题吗?
c++ - 获取库的文件路径
我正在为 Libretro 框架构建一个库,我想获取我的库的路径,以便我可以在与我的文件相同的目录中打开一个library.so
文件。
我按照如何实现 readlink 中的说明来查找路径,但这只是给了我调用我的库的可执行文件的路径。
php - 使远程服务器的客户端(Raspberry pi,php)可以访问键盘
所以这就是我想做的。我在我的树莓派 3 上启动并运行了 Apache2 服务器,该服务器目前用作使用 php 命令和 mpd/mpc 的网络收音机。树莓派还通过 HDMI 连接到显示器。
我现在想在网络服务器上有另一个页面,让我在模拟器中启动不同的 rom,并在连接到远程服务器的显示器上显示输出信号,还让我使用也连接到远程服务器的控制器。
这是我到目前为止所做的。
- 我已成功安装已启动并运行的 Retroarch。
- 我曾经
exec("export DISPLAY=:0.0; retroarch -c /home/pi/path/to/config -L /home/pi/path/to/libretro/core /home/pi/path/to/rom")
在远程服务器上启动模拟器。
问题如下。即使我在屏幕上成功启动了仿真,我也无法使用连接到远程服务器的输入设备。如何使服务器的输入设备可以通过 php-command 或其他方式访问?有人可以指出我实现这一目标的解决方案吗?除了配置文件参数之外,exec 命令似乎也不接受我的参数。我想这与用户权限有关。但我真的被困在这一点上。
感谢您的任何回复。
免责声明:这是我的第一篇文章。所以我很抱歉术语不好。
c - 如何触发保存文件的创建
我正在尝试创建一个 libretro 核心。这将是一个独立的游戏,所以我设置RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME
为true
. 该文档建议retro_get_memory_*
可用于保存数据而无需显式查询RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY
:
如果 libretro 内核无法使用常规内存接口 (retro_get_memory_data()),则保存目录应用于存储 SRAM、内存卡、高分等。
核心应该如何使用这个接口触发数据的保存?还是我误解了文档?
我希望前端调用retro_get_memory_{data,size}
,在停止核心时从暴露的缓冲区中读取数据,将数据保存到磁盘,并在下次核心启动时将其写回暴露的缓冲区。相反,我观察到:
- 如果我不提供内容文件,前端永远不会调用
retro_get_memory_{data,size}
. - 如果我提供一个内容文件(未使用),前端会
retro_get_memory_{data,size}
在之后调用retro_load_game
但不会写入磁盘。
请注意,这个问题是关于保存文件(自动持久化的数据,通常捕获玩家的进度),而不是由方法实现的保存状态(用户触发的游戏状态的快照)*serialize*
。
这是一个重现问题的简单示例(基于此示例):
c# - 无法将结构数组从 c 编组到 c#
我正在尝试将一组 c 结构编组为 C#(使用 Unity),但是,无论我使用哪种方法,我总是会遇到异常或崩溃。
我正在加载符合(或应该...)Libretro API 的 dll(libretro 核心),我无法使用 c/c++ 端(更准确地说,不允许我修改),这意味着我有处理我从该 dll 返回的数据,无论它是如何布局的。
C API 结构定义如下(RETRO_NUM_CORE_OPTION_VALUES_MAX 是一个值为 128 的常量):
我的 C# 映射现在看起来像这样:
回调函数在 C# 端具有以下签名:
retro_environment 是转换为枚举的无符号整数,对其执行切换,然后指示如何正确处理 void* 数据指针。这里的数据是一个 retro_core_options_intl*。
我可以通过 2 种方式进行 void* 转换:
或者
我用两种方法都得到了一个可读的地址(第一种是 intl.us,第二种是 intl->us),在我的特殊情况下,“本地”部分是空的,但“我们”部分被 API 定义为强制性的。intl->us 指向一个可变长度的 retro_core_option_definition 数组。
我遇到的问题是尝试读取此强制构造中的值。
我现在尝试加载的数组可以在这里看到:https ://github.com/visualboyadvance-m/visualboyadvance-m/blob/master/src/libretro/libretro_core_options.h第 51 行。
API 为“struct retro_core_option_value values[RETRO_NUM_CORE_OPTION_VALUES_MAX]”结构成员定义了一个固定大小,但是进来的代码几乎总是被定义为一个数组,其中最后一个元素是“{ NULL, NULL }”来表示结束,所以他们不要总是(几乎从不)包含 128 个值。
我试过了:
这会产生 NullReferenceException。
这给出了一个长度为 0 的 retro_core_option_definition 数组。
这给出了“目的地是一个装箱值”。
这基本上就是我所在的地方......任何帮助将不胜感激:)
整个代码库可以在这里找到:https ://github.com/Skurdt/LibretroUnityFE
wii - 无法写入/读取 Wii 系统内存。错误追溯
我在 Retroarch 的 Xbox 上使用 Mario kart Wii,当我打开它时说无法写入/读取 Wii 系统内存。帮助?