- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试编写一个 iOS 应用程序,它将将从麦克风接收到的声音传递给扬声器而不做任何更改。我读过苹果文档和指南。我从这个 guide 中选择了第一个图案.但什么也没发生——沉默。如您所见,我已尝试使用 AUAudioGraph(已注释)- 结果相同(在这个简单的示例中我是否需要它?)。
我在互联网上看到几个使用回调的示例,但我不想使用任何一个。可能吗?
有什么建议吗?感谢关注。
实际代码
#import "AudioController.h"
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioServices.h>
#define kInputBus 1
#define kOutputBus 0
@interface AudioController ()
{
AudioComponentDescription desc;
AudioComponent component;
AudioUnit unit;
AudioStreamBasicDescription audioFormat;
double rate;
//AUGraph graph;
}
@end
@implementation AudioController
- (void) setUp {
AVAudioSession *sess = [AVAudioSession sharedInstance];
NSError *error = nil;
rate = 44100.0;
[sess setPreferredSampleRate:rate error:&error];
[sess setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[sess setActive:YES error:&error];
rate = [sess sampleRate];
if (error) {
NSLog(@"%@", error);
}
NSLog(@"Init...");
[self createUnitDesc];
[self getComponent];
[self getAudioUnit];
[self enableIORec];
[self enableIOPb];
[self createFormat];
[self applyFormat];
OSStatus err = AudioUnitInitialize(unit);
if (noErr != err) {
[self showStatus:err];
}
/*NewAUGraph(&graph);
AUNode node;
AUGraphAddNode(graph, &desc, &node);
AUGraphInitialize(graph);
AUGraphOpen(graph);*/
}
- (void) createUnitDesc {
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
}
- (void) getComponent {
component = AudioComponentFindNext(NULL, &desc);
}
- (void) getAudioUnit {
OSStatus res = AudioComponentInstanceNew(component, &unit);
if (noErr != res) {
[self showStatus:res];
}
}
- (void) enableIORec {
UInt32 flag = 1;
OSStatus err = AudioUnitSetProperty(unit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input,
kInputBus,
&flag,
sizeof(flag));
if (noErr != err) {
[self showStatus:err];
}
}
- (void) enableIOPb {
UInt32 flag = 1;
OSStatus err = AudioUnitSetProperty(unit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Output,
kOutputBus,
&flag,
sizeof(flag));
if (noErr != err) {
[self showStatus:err];
}
}
- (void) createFormat {
// Describe format
audioFormat.mSampleRate = rate;//44100.00;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 2;
audioFormat.mBytesPerFrame = 2;
}
- (void) applyFormat {
OSStatus err = AudioUnitSetProperty(unit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
kInputBus,
&audioFormat,
sizeof(audioFormat));
if (noErr != err) {
[self showStatus:err];
}
}
- (void) start {
NSLog(@"starting");
OSStatus err = AudioOutputUnitStart(unit);
//AUGraphStart(graph);
if (noErr != err) {
[self showStatus:err];
}
}
- (void) end {
NSLog(@"ending");
OSStatus err = AudioOutputUnitStop(unit);
//AUGraphStop(graph);
if (noErr != err) {
[self showStatus:err];
}
}
- (void) showStatus:(OSStatus) st{
NSString *text = nil;
switch (st) {
case kAudioUnitErr_CannotDoInCurrentContext: text = @"kAudioUnitErr_CannotDoInCurrentContext"; break;
case kAudioUnitErr_FailedInitialization: text = @"kAudioUnitErr_FailedInitialization"; break;
case kAudioUnitErr_FileNotSpecified: text = @"kAudioUnitErr_FileNotSpecified"; break;
case kAudioUnitErr_FormatNotSupported: text = @"kAudioUnitErr_FormatNotSupported"; break;
case kAudioUnitErr_IllegalInstrument: text = @"kAudioUnitErr_IllegalInstrument"; break;
case kAudioUnitErr_Initialized: text = @"kAudioUnitErr_Initialized"; break;
case kAudioUnitErr_InstrumentTypeNotFound: text = @"kAudioUnitErr_InstrumentTypeNotFound"; break;
case kAudioUnitErr_InvalidElement: text = @"kAudioUnitErr_InvalidElement"; break;
case kAudioUnitErr_InvalidFile: text = @"kAudioUnitErr_InvalidFile"; break;
case kAudioUnitErr_InvalidOfflineRender: text = @"kAudioUnitErr_InvalidOfflineRender"; break;
case kAudioUnitErr_InvalidParameter: text = @"kAudioUnitErr_InvalidParameter"; break;
case kAudioUnitErr_InvalidProperty: text = @"kAudioUnitErr_InvalidProperty"; break;
case kAudioUnitErr_InvalidPropertyValue: text = @"kAudioUnitErr_InvalidPropertyValue"; break;
case kAudioUnitErr_InvalidScope: text = @"kAudioUnitErr_InvalidScope"; break;
case kAudioUnitErr_NoConnection: text = @"kAudioUnitErr_NoConnection"; break;
case kAudioUnitErr_PropertyNotInUse: text = @"kAudioUnitErr_PropertyNotInUse"; break;
case kAudioUnitErr_PropertyNotWritable: text = @"kAudioUnitErr_PropertyNotWritable"; break;
case kAudioUnitErr_TooManyFramesToProcess: text = @"kAudioUnitErr_TooManyFramesToProcess"; break;
case kAudioUnitErr_Unauthorized: text = @"kAudioUnitErr_Unauthorized"; break;
case kAudioUnitErr_Uninitialized: text = @"kAudioUnitErr_Uninitialized"; break;
case kAudioUnitErr_UnknownFileType: text = @"kAudioUnitErr_UnknownFileType"; break;
default: text = @"unknown error";
}
NSLog(@"TRANSLATED_ERROR = %li = %@", st, text);
}
- (void) dealloc {
AudioUnitUninitialize(unit);
[super dealloc];
}
@end
最佳答案
正如 warrenm 所说,在远程 IO 元素之间建立连接很有帮助。所以在所有初始化完成后放置的代码:
AudioUnitConnection conn;
conn.destInputNumber = kOutputBus;
conn.sourceAudioUnit = unit;
conn.sourceOutputNumber = kInputBus;
err = AudioUnitSetProperty(unit, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, kOutputBus, &conn, sizeof(conn));
if (noErr != err) { [self showStatus:err]; }
更新为了方便其他人使用该解决方案,我将在此处发布完整代码:
.h文件
#import <Foundation/Foundation.h>
@interface AudioController : NSObject
- (void)setUp;
- (void)start;
- (void)end;
@end
.m 文件
#import "AudioController.h"
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioServices.h>
#define kInputBus 1
#define kOutputBus 0
@interface AudioController ()
{
AudioComponentDescription desc;
AudioComponent component;
AudioUnit unit;
AudioStreamBasicDescription audioFormat;
double rate;
}
@end
@implementation AudioController
- (void)setUp
{
AVAudioSession *sess = [AVAudioSession sharedInstance];
NSError *error = nil;
rate = 44100.0;
[sess setPreferredSampleRate:rate error:&error];
[sess setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[sess setActive:YES error:&error];
rate = [sess sampleRate];
if (error) {
NSLog(@"%@", error);
}
NSLog(@"Initing");
[self createUnitDesc];
[self getComponent];
[self getAudioUnit];
[self enableIORec];
[self enableIOPb];
[self createFormat];
[self applyFormat];
OSStatus err = AudioUnitInitialize(unit);
if (noErr != err) {
[self showStatus:err];
}
AudioUnitConnection conn;
conn.destInputNumber = 0;
conn.sourceAudioUnit = unit;
conn.sourceOutputNumber = 1;
err = AudioUnitSetProperty(unit, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, 0, &conn, sizeof(conn));
if (noErr != err) {
[self showStatus:err];
}
}
- (void)createUnitDesc
{
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
}
- (void)getComponent
{
component = AudioComponentFindNext(NULL, &desc);
}
- (void)getAudioUnit
{
OSStatus res = AudioComponentInstanceNew(component, &unit);
if (noErr != res) {
[self showStatus:res];
}
}
- (void)enableIORec
{
UInt32 flag = 1;
OSStatus err = AudioUnitSetProperty(unit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input,
kInputBus,
&flag,
sizeof(flag));
if (noErr != err) {
[self showStatus:err];
}
}
- (void)enableIOPb
{
UInt32 flag = 1;
OSStatus err = AudioUnitSetProperty(unit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Output,
kOutputBus,
&flag,
sizeof(flag));
if (noErr != err) {
[self showStatus:err];
}
}
- (void)createFormat
{
// Describe format
audioFormat.mSampleRate = rate;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 2;
audioFormat.mBytesPerFrame = 2;
}
- (void)applyFormat
{
OSStatus err = AudioUnitSetProperty(unit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
kInputBus,
&audioFormat,
sizeof(audioFormat));
if (noErr != err) {
[self showStatus:err];
}
}
- (void)start
{
NSLog(@"starting");
OSStatus err = AudioOutputUnitStart(unit);
if (noErr != err) {
[self showStatus:err];
}
}
- (void)end
{
NSLog(@"ending");
OSStatus err = AudioOutputUnitStop(unit);
if (noErr != err) {
[self showStatus:err];
}
}
- (void)showStatus:(OSStatus)st
{
NSString *text = nil;
switch (st) {
case kAudioUnitErr_CannotDoInCurrentContext: text = @"kAudioUnitErr_CannotDoInCurrentContext"; break;
case kAudioUnitErr_FailedInitialization: text = @"kAudioUnitErr_FailedInitialization"; break;
case kAudioUnitErr_FileNotSpecified: text = @"kAudioUnitErr_FileNotSpecified"; break;
case kAudioUnitErr_FormatNotSupported: text = @"kAudioUnitErr_FormatNotSupported"; break;
case kAudioUnitErr_IllegalInstrument: text = @"kAudioUnitErr_IllegalInstrument"; break;
case kAudioUnitErr_Initialized: text = @"kAudioUnitErr_Initialized"; break;
case kAudioUnitErr_InstrumentTypeNotFound: text = @"kAudioUnitErr_InstrumentTypeNotFound"; break;
case kAudioUnitErr_InvalidElement: text = @"kAudioUnitErr_InvalidElement"; break;
case kAudioUnitErr_InvalidFile: text = @"kAudioUnitErr_InvalidFile"; break;
case kAudioUnitErr_InvalidOfflineRender: text = @"kAudioUnitErr_InvalidOfflineRender"; break;
case kAudioUnitErr_InvalidParameter: text = @"kAudioUnitErr_InvalidParameter"; break;
case kAudioUnitErr_InvalidProperty: text = @"kAudioUnitErr_InvalidProperty"; break;
case kAudioUnitErr_InvalidPropertyValue: text = @"kAudioUnitErr_InvalidPropertyValue"; break;
case kAudioUnitErr_InvalidScope: text = @"kAudioUnitErr_InvalidScope"; break;
case kAudioUnitErr_NoConnection: text = @"kAudioUnitErr_NoConnection"; break;
case kAudioUnitErr_PropertyNotInUse: text = @"kAudioUnitErr_PropertyNotInUse"; break;
case kAudioUnitErr_PropertyNotWritable: text = @"kAudioUnitErr_PropertyNotWritable"; break;
case kAudioUnitErr_TooManyFramesToProcess: text = @"kAudioUnitErr_TooManyFramesToProcess"; break;
case kAudioUnitErr_Unauthorized: text = @"kAudioUnitErr_Unauthorized"; break;
case kAudioUnitErr_Uninitialized: text = @"kAudioUnitErr_Uninitialized"; break;
case kAudioUnitErr_UnknownFileType: text = @"kAudioUnitErr_UnknownFileType"; break;
default: text = @"unknown error";
}
NSLog(@"TRANSLATED_ERROR = %li = %@", st, text);
}
- (void)dealloc
{
AudioUnitUninitialize(unit);
[super dealloc];
}
@end
关于iOS AudioUnits 通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13664087/
我有一个 AudioUnit,对应的回调正常工作,但现在,我需要将它发送到 RemoteIO,因为我正在实现一些需要 RemoteIO AudioUnit 才能工作的框架。 那么...我需要与此 au
我正在熟悉如何使用 AudioUnit 来播放声音,但对数据包和帧的概念感到困惑。我想知道: AudioUnit上下文中数据包和帧的定义是什么 每个数据包使用多个样本以及每个帧使用多个数据包的交易是什
我有使用 AudioUnit 将正弦波渲染到输出的简单代码。我的问题是:我应该在框架中放入的值范围是多少?我的意思是,在 AudioUnitRender 函数中,我应该为缓冲区数组提供一些音频数据……
我编写了一个简单的 audiounit,它应该交换立体声源的左右声道。对于使用 BASS 库的命令行程序,此代码的移植版本在 C 中运行良好,但我无法让相同的代码在 Xcode 中为 audiouni
我已经实现了一个 AUGraph,其中包含一个 AudioUnit,用于处理来自麦克风和耳机的 IO。我遇到的问题是缺少音频输入 block 。 我相信样本在硬件到软件缓冲区交换期间丢失了。我尝试将
我正在尝试编写一个 iOS 应用程序,从麦克风捕获声音,将其通过高通滤波器,并对处理后的声音进行一些计算。基于 Stefan Popp 的 MicInput ( http://www.stefanpo
所以我的 AudioUnit 从 iOS 中的麦克风/线路输入中获取数据时遇到了一些问题。我能够按照我认为合适的方式设置所有内容,它正在调用我的 recordingCallback,但是我从缓冲区中获
我正在尝试编写一个 iOS 应用程序,它将将从麦克风接收到的声音传递给扬声器而不做任何更改。我读过苹果文档和指南。我从这个 guide 中选择了第一个图案.但什么也没发生——沉默。如您所见,我已尝试使
我的应用程序正在利用 AudioUnit 功能为节拍器应用程序产生短促的声音。一切都运行良好。 现在我想从设备上的 iTunes 库播放 MP3,并使用 MPMusicPlayerController
我的问题涉及音频单元。为了设计适用于 iPhone 的变声应用程序(使用 Objective-C xCode),我使用此网站上的 RemoteIO audioUnit 示例: http://atast
我已经用头撞墙有一段时间了。我的 Xcode 项目在重构时出现了一点困惑,并且拒绝构建。我已经消除了所有其他错误,除了最后一个链接时错误: Framework not found AudioUnit
我可以设置实时播放并在远程 IO 单元之间放置延迟单元以设置延迟效果。 AudioComponentDescription delayDesc; delayDesc.componentType =
我最近在Mac上使用AudioUnits设计了一个录音机。它的设计类似于视频安全系统,可以连续记录,并带有图形化的功率电平显示,以供回放浏览。 我注意到,每85分钟就会出现3分钟的失真。消除了一天之后
用于创建版本3 AudioUnit的示例代码演示了实现如何需要返回功能块以进行渲染处理。该块都将从前一个 通过pullInputBlock链中的AxudioUnit并将处理后的样本提供给输出缓冲区。如
当用户更改参数或预设时,我如何/何时实际更新仪器? AUInstrumentBase 中没有ParameterUpdated 或PresetSelected 类型的方法/回调 最佳答案 相关机制是 A
对于音频单元,您必须像这样将节点添加到图表中...... AUGraphAddNode(processingGraph, &mixerUnitDescription, &mixerNode) AUGr
我在想是否有可能获得对 AudioUnit 记录(可能结束播放)设备的独占访问,以确保在我工作时(最终甚至在后台)任何其他进程都不会访问它? 任何建议都会有帮助。 提前谢谢您! 最佳答案 您的应用在前
我正在构建一个应用程序,该应用程序涉及在应用均衡 (EQ) 效果的同时播放用户音乐库中的歌曲。我以前只使用过 AudioUnits 来生成声音,所以我遇到了一些麻烦。 我当前的计划是使用 AVAsse
我正在尝试实现播放通过套接字从远程服务器接收到的 pcm 音频。这是我之前的问题 link .这工作正常,因为我使用循环缓冲区始终输入传入缓冲区。 但是我有一个问题,如果我没有为我的输出提供缓冲区,就
我使用 AudioUnit 以 8 KHz 采样率和 8 位音频样本录制和播放音频。我使用以下来源的示例:https://github.com/fuxx/MicInput 播放部分基于回调模式。使用这
我是一名优秀的程序员,十分优秀!