百科问答小站 logo
百科问答小站 font logo



音频程序是如何在现代操作系统抢占式时间分片机制下持续输出信号的? 第1页

  

user avatar   yang-leonier 网友的相关建议: 
      

一般播放PCM是异步回调机制,系统通知应用程序缓冲区播放完了,应用程序往缓冲区里面写新数据。Windows从最早Windows 3.0 MME的MMSYSTEM接口开始就是这样的了。


user avatar   lu-zheng-yang-23 网友的相关建议: 
      

先说一下我的水平很差,只是做一些概念上的讨论。如果你认为我讲的不对,欢迎指正和讨论。

首先,计算机内部没有一个真正的“连续”时间的概念。计算机的本质是数字系统,它的时间和空间都是离散的。

比如说CD音质,16bit,双声道,44100Hz的音频,那就是每秒钟输出44100个32bit的数据。理论来说,CPU只需要每秒钟输出44100次数据就行了。假设CPU是3GHz的时钟,那么也就是大约68000个时钟输出一次。

试想一个音乐播放软件,它在硬盘上读取FLAC音频文件后,通过解码器将其转换成LPCM存储在内存里。基本上,没有任何现代的良好设计的音乐播放器会在内存里完整存储一首歌解码后的内容,可能最多就是几秒钟的buffer。存储全部的数据是非常没有意义且浪费CPU的运算能力的。

对于以GHz计算的CPU来说,I/O的时间几乎相当于无限长。CPU不会等待I/O的完成,它会先去处理其他的计算任务,等I/O完成后再试图去解码数据并存储回内存。

声卡也不会直接劳烦CPU去传输这个数据,要不然这个开销实在太大,让CPU去等待I/O结束这是不可想象的事情。现代的计算机会使用DMA,使得外部设备可以通过DMA通道直接读写内存,工作流程类似于:

  1. CPU收到I/O请求,设置DMA的数据块大小和起始地址的寄存器;
  2. I/O开始,CPU可以开始处理其他的计算任务而无需等待I/O结束;
  3. I/O完毕,DMA控制器发送中断给CPU,重置相关寄存器,CPU继续其他任务。

user avatar   martin1994 网友的相关建议: 
      

是缓冲。Windows 游戏卡死前的最后一小段声音会循环播放,盲猜那就是缓冲区的大小。




  

相关话题

  怎样自己写一个简单的操作系统? 
  内存(DRAM)的连续读写速度和随机读写速度是一样的吗? 
  Linux 内核中,多线程栈空间模型是怎样的? 
  如何评价 macOS Mojave 10.14? 
  从操作系统内存管理来说,malloc申请一块内存的背后原理是什么? 
  win10初装系统时怎么分区? 
  发生中断时CPU怎么知道程序的地址? 
  2021年操作系统设计与实现研讨会(OSDI)有哪些值得关注的文章? 
  在程序运行后,调试打断点时,反汇编看到的是虚拟地址还是物理地址? 
  用Android系统做出的游戏主机为何与XBOX、PS的游戏体验相去甚远? 

前一个讨论
对苹果用原神来宣传性能,你有何看法?
下一个讨论
莆田一病例此前「9次核酸1次血清均阴性」,应该将隔离期延长吗?病毒为什么这么狡猾?





© 2024-05-18 - tinynew.org. All Rights Reserved.
© 2024-05-18 - tinynew.org. 保留所有权利