- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的场景是这样的:用户与 GUI 元素交互,音频回调函数读取 UI 设置的变量,计算样本并将样本存储在缓冲区(或任何数据结构)中,缓冲区然后由 UI 读取并绘制波形(在绘制循环中每秒 60 次)。
现在,根据我读过的一些资料(Linux 音频开发列表中的一个线程,this 和 this),我需要某种无需锁定即可同时读取和写入的数据结构,或者,我需要某种跨线程通知系统来传递变量。
然而,some examples我见过使用 C++ std 库中的普通 vector ,它们从一个线程读取并从另一个线程写入,当我运行程序时,它们运行良好。
最佳答案
如果您有访问同一内存(读取或写入)的线程,那么您要么需要使用锁,要么需要使用无锁数据结构。否则,当多个线程同时访问您的数据结构时,它们可能会损坏(或看起来已损坏)。
您指向的示例似乎使用了提前分配的固定大小 vector 。音频线程正在写入此缓冲区,而 UI 线程正在读取它,两者不同步。由于两者可以完全并发运行,因此 UI 线程无法保证实际读取的是什么数据;它可能从更新 N 读取一些数据,从更新 N+1 读取一些数据。它可能会遗漏某些数据或读取某些数据两次(或更多次)。这不是构建音频应用程序的可靠方法。对于一个简单的可视化应用程序来说,它“工作”得很好,因为可视化的结果不需要是完美的,但它完全不适合录制或回放应用程序。
音频应用程序经常使用无锁数据结构(而不是使用锁),因为音频播放具有“实时”要求。如果您的音频缓冲区包含 100 毫秒的声音,那么您需要每秒填充这些缓冲区 10 次,否则您的音频播放会断断续续。另一种说法是,您每次都有 100 毫秒的截止时间 来填充缓冲区。
有各种各样的事情会导致您错过这个 100 毫秒的截止日期;如果系统太忙,您的进程可能无法安排,或者页面错误可能导致磁盘读取阻塞进程太长时间,仅举几个例子。如果您尝试获取锁但另一个线程持有它超过 100 毫秒,这将使您错过最后期限。这就是为什么使用锁对音频应用程序不利的原因;另一个持有锁太久的线程可能会让您错过最后期限。
使用无锁数据结构,无需等待锁,因此其他线程无法停止您的进程。它可以让您更轻松地完成音频 I/O 截止日期。
但是在您对无锁算法感到兴奋之前,您应该知道它们比锁更微妙并且需要更多的专业知识才能正确使用。基本上,如果您不是该领域的专家,则不应尝试自己编写无锁算法。也许有一个很好的开源库,它有一些无锁算法实现;我最近没看。
但是请注意,除非您在音频线程中也非常小心以避免其他可能的延迟原因,否则使用无锁算法所需的额外工作或多或少会被浪费。具体来说:
您的音频线程不得 malloc()
或 free()
任何内存(大多数 malloc/free 实现在内部获取全局锁)
您必须确保您的音频线程访问的任何内存都没有被调出(例如使用 mlock()
)
除了声卡之外,您的音频线程不得执行任何 I/O,因为 I/O 调用可能会阻塞。
除非您非常勤奋并采取了所有这些步骤,否则您还不如对与其他线程共享的数据使用锁,但要确保锁的持有时间非常短。例如,确保不要在持有锁的 UI 线程中执行任何 malloc()/free() 或阻塞系统调用。
关于c++ - 什么时候需要无锁数据结构来跨线程读取/写入音频应用程序中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9255282/
我一直在为实时流和静态文件(HTTP 上的 MP3)构建网络广播播放器。我选了Howler.js作为规范化 quirks 的后端的 HTML5 Audio (思考:自动播放、淡入/淡出、进度事件)。
vue移动端input上传视频、音频,供大家参考,具体内容如下 html部分 ?
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 7年前关闭。 Improve this questi
我想在我的程序中访问音频和视频。 MAC里面可以吗? 我们的程序在 Windows 上运行,我使用 directshow 进行音频/视频编程。但我想在 MAC 中开发相同的东西。 有没有像direct
我的应用程序(使用 Flutter 制作,但这应该无关紧要)具有类似于计时器的功能,可以定期(10 秒到 3 分钟)发出滴答声。我在我的 Info.plist 中激活了背景模式 Audio、AirPl
我是 ionic 2 的初学者 我使用了音频文件。 import { Component } from '@angular/core'; import {NavController, Alert
我有一个包含ListView和图片的数据库,我想在每个语音数据中包含它们。我已经尝试过,但是有很多错误。以下是我的java和xml。 数据库.java package com.example.data
我在zend framework 2上建立了一个音乐社交网络。您可以想象它与SoundCloud相同,用户上传歌曲,其他用户播放它们,这些是网站上的基本操作。 我知道将要托管该页面的服务器将需要大量带
我正在尝试在android应用中播放音频,但是在代码中AssetFileDescriptor asset1及其下一行存在错误。这是代码: MediaPlayer mp; @Override prote
我对 WordPress Audio Shortcode有问题。我这样使用它: 但是在前面,在HTML代码中我得到了: document.createElement('audio');
我正在做一项关于降低噪音的滤波技术的实验。我在数据集中的样本是音频文件(.wav),因此,我有:原始录制的音频文件,我将它们与噪声混合,因此变得混合(噪声信号),我将这些噪声信号通过滤波算法传递,输出
一个人会使用哪种类型的神经网络架构将声音映射到其他声音?神经网络擅长学习从序列到其他序列,因此声音增强/生成似乎是它们的一种非常流行的应用(但不幸的是,事实并非如此-我只能找到一个(相当古老的)洋红色
这个让我抓狂: 在专用于此声音播放/录制应用程序的 Vista+ 计算机上,我需要我的应用程序确保(默认)麦克风电平被推到最大。我该怎么做? 我找到了 Core Audio lib ,找到了如何将 I
{ "manifest_version": 2, "name": "Kitten Radio Extension", "description": "Listen while browsi
class Main { WaveFileReader reader; short[] sample; Complex[] tmpComplexArray; publi
我正在使用电话录音软件(android),该软件可以记录2个人在电话中的通话。每个电话的输出是一个音频文件,其中包含来自 call 者和被 call 者的声音。 但是,大多数情况下,运行此软件的电话发
我正在构建一个需要语音激活命令的Web应用程序。我正在使用getUserMedia作为音频输入。 对于语音激活命令,该过程是用户将需要通过记录其语音来“校准”命令。例如,对于“停止”命令,用户将说出“
我正在开发一个Cordova应用程序,并将PouchDB用作数据库,当连接可用时,它将所有信息复制到CouchDB。 我成功存储了简单的文本和图像。 我一直在尝试存储视频和音频,但是没有运气。 我存储
我正在开发web application,我必须在其中使用.MP3的地方使用播放声音,但是会发生问题。 声音为play good in chrome, Firefox,但为safari its not
如何减少音频文件的位深?是否忽略了MSB或LSB?两者混合吗? (旁问:这叫什么?) 最佳答案 TL / DR:将音频曲线高度变量右移至较低位深度 可以将音频视为幅度(Y轴)随时间(X轴)的模拟曲线。
我是一名优秀的程序员,十分优秀!