设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 7406|回复: 16
打印 上一主题 下一主题

[通用发布] Seal 0.1.1 「焦尾」3D音頻渲染庫

[复制链接]

Lv1.梦旅人

梦石
0
星屑
66
在线时间
1641 小时
注册时间
2011-9-26
帖子
313
1
发表于 2013-3-30 11:00:41 | 显示全部楼层
有一个问题困扰在下好久了,希望能够赐教。
https://github.com/Shy07/SINRGE2
这个是在下的一个项目,未对 seal 或 ruby 做修改,但是流播放一直不太稳定,其他程序对硬盘读写一频繁,seal 就会自动停止播放。source 的状态一直被监视着,应该没理由会被 GC 回收才对。恳请指教。

PS:在下签出了 RGE2 的 SVN,发现 Demo 中 seal 不支持流播放,这个意味着什么吗?
愿善用者善用之
https://github.com/Shy07/SINRGE2
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
1641 小时
注册时间
2011-9-26
帖子
313
2
发表于 2013-3-31 21:33:31 | 显示全部楼层
本帖最后由 Shy07 于 2013-3-31 21:35 编辑
苏小脉 发表于 2013-3-31 08:53
感謝反饋!應該是個BUG,我這兩天先測試一下。

RGE2 的開發現在既然沒有繼續,我也就暫時沒有把新的代碼 ...


另外希望加一个从内存读取的函数,方便ruby层的处理
例如:
RUBY 代码复制
  1. [url=home.php?mod=space&uid=171370]@source[/url] = Seal::Source.new
  2.  
  3. buf = ""
  4. open("audiofile", "rb") {|f| buf = f.read}
  5.  
  6. # do something like decrypting
  7.  
  8. @source.buffer = Seal::Buffer.new(buf, buf.size)
  9.  
  10. @source.play


这样或许还可以用 IO#read_nonblock 来干些别的事情?  
愿善用者善用之
https://github.com/Shy07/SINRGE2
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
1641 小时
注册时间
2011-9-26
帖子
313
3
发表于 2013-4-12 22:29:31 | 显示全部楼层
苏小脉 发表于 2013-4-10 07:18
嗯,这个好办,已经计划在下一次发布里了……

关于流播放中断的问题我现在暂时还没能重现,你试过改变( ...

我觉得不是chunk_size、queue_size的大小问题,而是读取的容错处理。

因为我猜测问题出在seal读取时,而非播放时。比如seal在播放时而且正好在读取,这时候我用PotPlayer打开大比特率的视频文件,中断问题可以100%重现。
而其他软件如foobar,也会偶尔出现卡顿现象,但是还能继续播放。

而修改chunk_size、queue_size正好证明了我的猜测:
我把chunk_size设为1048576,缓存的数据多了,读取次数减少,这时候打开PotPlayer遇上seal读取的几率减少,相应地seal中断几率也减少。

不知道我这样理解是否正确?


愿善用者善用之
https://github.com/Shy07/SINRGE2
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
1641 小时
注册时间
2011-9-26
帖子
313
4
发表于 2013-5-20 20:54:57 | 显示全部楼层
本帖最后由 Shy07 于 2013-5-20 21:19 编辑
苏小脉 发表于 2013-5-20 08:37
嗯,我说试试改 chunk_size 和 queue_size 也是为了验证是否是这个问题……其实这是 OpenAL 的一个限制, ...


嗯,一会儿试试 :-)

顺便再反馈个问题:

C 代码复制
  1. seal_move_listener
  2. seal_move_src

这两个函数声明的时候用了 SEAL_API,但是 msvc 下的 exports.def 并没有导出这两个函数,似乎是忘了?


原来已经修正了,那暂时应该没问题了 :-)
愿善用者善用之
https://github.com/Shy07/SINRGE2
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
1641 小时
注册时间
2011-9-26
帖子
313
5
发表于 2014-4-11 21:22:51 | 显示全部楼层
Sion 发表于 2014-4-11 19:20
反馈个小bug,这个wav文件加载不了。
Seal.startup
s = Seal::Source.new

比特深度(bit depth)问题,参考主楼注意事项第二条:
Seal 並不支持解碼所有 WAVE 的子格式。Seal 只是出於測試的目的提供了對無壓縮的小於等於 16bps 的 WAVE 的支持,但實際上微軟官方的規格中有很多 WAVE 的子格式(包括壓縮失真格式)。建議大家統一使用 Ogg Vorbis 格式,開放自由。

我转了一个8bit的wav,测试可以播放
voice_005.zip (168.44 KB, 下载次数: 39)

附 foobar2000 转换设置,测试选择 8 bit 或 16 bit,seal 均可播放

点评

谢谢提醒,疏忽了  发表于 2014-4-11 21:36
愿善用者善用之
https://github.com/Shy07/SINRGE2
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
1641 小时
注册时间
2011-9-26
帖子
313
6
发表于 2014-4-11 21:39:06 | 显示全部楼层
Sion 发表于 2014-4-11 19:20
反馈个小bug,这个wav文件加载不了。 已解决

这东西还是蛮好用的。

"Cannot allocate additional memory" 问题最好确认一下音频文件有没有问题
  1. Searching 20 files for "SEAL_CANNOT_ALLOC_MEM"

  2. H:\Projects\seal-master\src\seal\err.c:
  3.    42      case SEAL_CANNOT_OPEN_FILE:
  4.    43          return "Cannot open the specified file";
  5.    44:     case SEAL_CANNOT_ALLOC_MEM:
  6.    45          return "Cannot allocate additional memory";
  7.    46  
  8.    ..
  9.   107          return SEAL_BAD_OP;
  10.   108      case AL_OUT_OF_MEMORY:
  11.   109:         return SEAL_CANNOT_ALLOC_MEM;
  12.   110      default:
  13.   111          return SEAL_OK;

  14. H:\Projects\seal-master\src\seal\ov.c:
  15.   117      povf = malloc(sizeof (OggVorbis_File));
  16.   118      if (povf == 0)
  17.   119:         return SEAL_CANNOT_ALLOC_MEM;
  18.   120  
  19.   121      if ((err = setup(&attr, povf, filename)) != SEAL_OK) {

  20. H:\Projects\seal-master\src\seal\raw.c:
  21.    13      buf = realloc(raw->data, size);
  22.    14      if (buf == 0)
  23.    15:         return SEAL_CANNOT_ALLOC_MEM;
  24.    16      raw->data = buf;
  25.    17      raw->size = size;
  26.    ..
  27.    26      raw->data = malloc(size);
  28.    27      if (raw->data == 0)
  29.    28:         return SEAL_CANNOT_ALLOC_MEM;
  30.    29  
  31.    30      return SEAL_OK;

  32. H:\Projects\seal-master\src\seal\src.c:
  33.   191      bufs = malloc(sizeof (unsigned int) * nbufs_processed);
  34.   192      if (bufs == 0)
  35.   193:         return SEAL_CANNOT_ALLOC_MEM;
  36.   194  
  37.   195      if ((err = unqueue_bufs(src, nbufs_processed, bufs)) == SEAL_OK)

  38. H:\Projects\seal-master\src\seal\wav.c:
  39.   209      wav_stream = malloc(sizeof (wav_stream_t));
  40.   210      if (wav_stream == 0)
  41.   211:         return SEAL_CANNOT_ALLOC_MEM;
  42.   212  
  43.   213      wav_stream->file = _seal_fopen(filename);
  44.   ...
  45.   258      data = malloc(nbytes);
  46.   259      if (data == 0)
  47.   260:         return SEAL_CANNOT_ALLOC_MEM;
  48.   261  
  49.   262      wav_stream->offset += nbytes;

  50. 8 matches across 5 files
复制代码
根据 seal 源码,这个属于文件加载错误
  1. buffers = []

  2. 1024.times { buffers << Seal::Buffer.new("voice_005.wav") }

  3. s = Seal::Source.new
  4. s.buffer = buffers[-1]

  5. s.play
复制代码
这段代码我这里测试没问题
愿善用者善用之
https://github.com/Shy07/SINRGE2
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
1641 小时
注册时间
2011-9-26
帖子
313
7
发表于 2014-4-11 22:03:49 | 显示全部楼层
Sion 发表于 2014-4-11 21:45
感谢帮忙,不过这样测试就会出那个,应该是设置了最大值:

这个应该是硬性限制了,256 个 Source,也就是 256 个声源同时播放
如果只是加载 256 个以上的文件,但同时播放的数量小于 256 个的话,建议使用我前面给出的方案
加载若干个文件到 Buffer,等需要的时候给空闲的 Source#buffer 赋值,再进行播放

如果要同时播放 256 个音频文件的话,那估计需要修改 OpenAL 源码了,甚至有可能修改都不起作用,电脑硬件也可能有限制
愿善用者善用之
https://github.com/Shy07/SINRGE2
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-8 21:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表