Skip to content

Commit 547a74b

Browse files
author
yangrtc
committed
7.0.202
1 parent 1930247 commit 547a74b

File tree

1 file changed

+151
-0
lines changed

1 file changed

+151
-0
lines changed
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
//
2+
// Copyright (c) 2019-2025 yanggaofeng
3+
//
4+
#include "YangAudioDeviceIos.h"
5+
#if Yang_OS_IOS
6+
7+
#include <yangutil/sys/YangLog.h>
8+
#import <Foundation/Foundation.h>
9+
#import <AudioToolbox/AudioToolbox.h>
10+
#import <AVFAudio/AVAudioSession.h>
11+
12+
static int32_t yang_ios_audio_getDefaultDevice(YangIosAudio* audio){
13+
uint32_t flag=1;
14+
OSStatus status;
15+
AudioUnitElement busType=audio->isInput?1:0;
16+
AudioComponentDescription audioDesc;
17+
audioDesc.componentType = kAudioUnitType_Output;
18+
audioDesc.componentSubType = kAudioUnitSubType_RemoteIO;//kAudioUnitSubType_RemoteIO;//kAudioUnitSubType_VoiceProcessingIO;
19+
audioDesc.componentManufacturer = kAudioUnitManufacturer_Apple;
20+
audioDesc.componentFlags = 0;
21+
audioDesc.componentFlagsMask = 0;
22+
23+
AudioComponent audioComponent = AudioComponentFindNext(NULL, &audioDesc);
24+
25+
AudioComponentInstanceNew(audioComponent, &audio->audioUnit);
26+
27+
status = AudioUnitSetProperty(audio->audioUnit,
28+
kAudioOutputUnitProperty_EnableIO,
29+
audio->isInput?kAudioUnitScope_Input:kAudioUnitScope_Output,
30+
busType,&flag,sizeof(flag));
31+
32+
if(status!=noErr){
33+
if(audio->isInput)
34+
yang_error("ios input audio fail(%d)",(int32_t)status);
35+
else
36+
yang_error("ios output audio fail(%d)",(int32_t)status);
37+
return 1;
38+
}
39+
40+
return Yang_Ok;
41+
}
42+
43+
44+
int32_t yang_ios_audio_init(YangIosAudio* audio,uint32_t sample,uint32_t channel)
45+
{
46+
OSStatus status=noErr;
47+
AudioUnitElement busType=audio->isInput?1:0;
48+
AudioStreamBasicDescription desc;
49+
uint32_t size = sizeof(desc);
50+
int32_t tryTimes = 0;
51+
yang_memset(&desc,0,sizeof(desc));
52+
53+
if(yang_ios_audio_getDefaultDevice(audio)!=Yang_Ok)
54+
return 1;
55+
56+
if(audio->isInput){
57+
status=AudioUnitSetProperty(audio->audioUnit,
58+
kAudioOutputUnitProperty_SetInputCallback,
59+
kAudioUnitScope_Global, busType,
60+
&audio->callback, sizeof(audio->callback));
61+
}else{
62+
63+
status = AudioUnitSetProperty(
64+
audio->audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input,
65+
busType, &audio->callback, sizeof(audio->callback));
66+
}
67+
yang_memset(&desc,0,sizeof(desc));
68+
69+
desc.mSampleRate = (Float64 )sample;
70+
desc.mFormatID = kAudioFormatLinearPCM;
71+
#if Yang_Enable_MacAudioFloat
72+
desc.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked;
73+
desc.mFramesPerPacket = 1;
74+
desc.mChannelsPerFrame = channel;
75+
desc.mBitsPerChannel = 32;
76+
desc.mBytesPerPacket = desc.mBytesPerFrame = desc.mChannelsPerFrame * sizeof(float);
77+
desc.mBytesPerFrame = desc.mChannelsPerFrame * sizeof(float);
78+
#else
79+
desc.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger|kLinearPCMFormatFlagIsPacked;
80+
desc.mFramesPerPacket = 1;
81+
desc.mChannelsPerFrame = channel;
82+
desc.mBitsPerChannel = 16;
83+
desc.mBytesPerPacket = desc.mBytesPerFrame = desc.mChannelsPerFrame * sizeof(int16_t);
84+
desc.mBytesPerFrame = desc.mChannelsPerFrame * sizeof(int16_t);
85+
#endif
86+
if(audio->isInput){
87+
status= AudioUnitSetProperty(audio->audioUnit, kAudioUnitProperty_StreamFormat,
88+
kAudioUnitScope_Output, busType, &desc, size);
89+
}else{
90+
status=AudioUnitSetProperty(audio->audioUnit, kAudioUnitProperty_StreamFormat,
91+
kAudioUnitScope_Input, busType, &desc, size);
92+
}
93+
94+
if(status!=noErr){
95+
yang_error("get ios %s format failed(%d),sample=%d,channel=%d",audio->isInput?(char*)"capture":(char*)"render",(int)status,sample,channel);
96+
return 1;
97+
}
98+
99+
status = AudioUnitInitialize(audio->audioUnit);
100+
while(status!=noErr){
101+
++tryTimes;
102+
if (tryTimes == 5)
103+
break;
104+
105+
yang_usleep(100*1000);
106+
107+
status = AudioUnitInitialize(audio->audioUnit);
108+
}
109+
110+
if (status != noErr) {
111+
//kAudioUnitErr_FailedInitialization
112+
yang_error("ios init (%s) audio unit error(%d)", audio->isInput?(char*)"capture":(char*)"render",(int)status);
113+
return 1;
114+
}
115+
116+
return Yang_Ok;
117+
}
118+
119+
void yang_ios_audio_uninit(YangIosAudio* audio){
120+
AudioUnitUninitialize(audio->audioUnit);
121+
AudioComponentInstanceDispose(audio->audioUnit);
122+
}
123+
124+
125+
int32_t yang_ios_init_AudioSession(uint32_t *sample,int32_t audioType){
126+
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
127+
NSError *error = nil;
128+
// 设置音频会话类别
129+
if(audioType==0){
130+
[audioSession setCategory:AVAudioSessionCategoryRecord error:&error];
131+
}else if(audioType==1){
132+
[audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
133+
}
134+
135+
if (error) {
136+
NSLog(@"设置音频会话类别失败: %@", error);
137+
return 1;
138+
}
139+
140+
// 激活音频会话
141+
[audioSession setActive:YES error:&error];
142+
if (error) {
143+
NSLog(@"激活音频会话失败: %@", error);
144+
return 1;
145+
}
146+
147+
//*sample = audioSession.sampleRate;
148+
return Yang_Ok;
149+
}
150+
151+
#endif

0 commit comments

Comments
 (0)