objective-c与cocos2d-x的互相调用实现获取麦克风音量大小

来源:互联网 发布:cdkey软件 编辑:程序博客网 时间:2024/06/04 18:06

为了在游戏中增加一些效果,需要实施的获取ios设备的麦克风音量,为此,在网上找了好多资料,终是未能满足要求,最后在这位朋友扬名的博客上找到了对应的实例,同时也感谢扬名的分享,这里给出链接http://www.cnblogs.com/pure/archive/2013/03/10/2933440.html,望各位朋友共同学习。

头文件如下:

#import <UIKit/UIKit.h>#import <AVFoundation/AVFoundation.h>#import <CoreAudio/CoreAudioTypes.h>#include "HelloWorldScene.h"@interface MicBlowViewController : UIViewController {AVAudioRecorder *recorder;NSTimer *levelTimer;double lowPassResults;        HelloWorld* m_pcallBack;//获取麦克风音量的layer层}- (void)levelTimerCallback:(NSTimer *)timer;- (void)setThe:(HelloWorld*)callback;@end
cpp文件如下:

#import "MicBlowViewController.h"#include "HelloWorldScene.h"@implementation MicBlowViewController- (void)viewDidLoad {    [super viewDidLoad];NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:  [NSNumber numberWithFloat: 44100.0],                 AVSampleRateKey,  [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,  [NSNumber numberWithInt: 1],                         AVNumberOfChannelsKey,  [NSNumber numberWithInt: AVAudioQualityMax],         AVEncoderAudioQualityKey,  nil];NSError *error;recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];if (recorder) {[recorder prepareToRecord];recorder.meteringEnabled = YES;[recorder record];levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];} elseNSLog([error description]);}- (void)setThe:(HelloWorld*)callback{        m_pcallBack = callback;    }- (void)levelTimerCallback:(NSTimer *)timer {//起一个计时器不断测试[recorder updateMeters];const double ALPHA = 0.05;double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;    if((lowPassResults > 0.4) && (lowPassResults < 0.95))    {         NSLog(@"value = %f", lowPassResults);        m_pcallBack->voiceVec.push_back(lowPassResults);//将结果保存到voidcVec中    }}- (void)dealloc {[levelTimer release];[recorder release];    [super dealloc];}@end在这里我根据自己项目的需求做了如上改动,经过测试,虽然结果与实际情况可能有点出入,但还算可以。
下面就可以在自己写的cpp里调用该接口了,这里贴出我的调用方式

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)    MicBlowViewController *micBlow = [[MicBlowViewController alloc] init];//创建对象并初始化    [micBlow setThe:this];//将HelloWorld指针传给oc中的MicBlowViewController,方便取出返回值    [micBlow viewDidLoad];//调用viewDidLoad函数    #endif
增加一个setTHe函数是为了将测试出的结果反馈到HelloWorld,然后在HelloWorld可以根据返回值做出相应的操作,之前没接触过oc,通过这个功能也是简单的了解了一下oc的语法和函数用法,继续学习!!!




0 0
原创粉丝点击