recordAudioVC.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. #include <CoreFoundation/CoreFoundation.h>
  2. #import <MobileCoreServices/MobileCoreServices.h>
  3. #import <AVFoundation/AVFoundation.h>
  4. #import "MixerHostAudio.h"
  5. #import "recordAudioVC.h"
  6. #import "UIImage-Extensions.h"
  7. /*
  8. void audioRouteChangeListenerCallback1 ( void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize, const void *inPropertyValue ){
  9. if(inUserData == nil)
  10. return;
  11. recordViewController *jxrecorder = (recordViewController *) inUserData;
  12. if(!jxrecorder.view.userInteractionEnabled)
  13. return;
  14. CFDictionaryRef routeChangeDictionary = inPropertyValue;
  15. CFNumberRef routeChangeReasonRef = CFDictionaryGetValue (routeChangeDictionary,CFSTR (kAudioSession_AudioRouteChangeKey_Reason));
  16. SInt32 routeChangeReason;
  17. CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);
  18. if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable)
  19. {
  20. [jxrecorder pause:nil];
  21. BOOL b = [jxrecorder getHeadsetMode];
  22. jxrecorder.isHeadsetTrue = b;
  23. [jxrecorder headsetChanged:b];
  24. }
  25. if (routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable)
  26. {
  27. // Headset is plugged in..
  28. BOOL b = [jxrecorder getHeadsetMode];
  29. jxrecorder.isHeadsetTrue = b;
  30. [jxrecorder headsetChanged:b];
  31. }
  32. jxrecorder = nil;
  33. }*/
  34. @implementation recordAudioVC
  35. @synthesize delegate;
  36. @synthesize didRecord;
  37. @synthesize timeLen;
  38. @synthesize outputFileName;
  39. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
  40. self = [super initWithNibName:nil bundle:nil];
  41. //self.view.frame = g_window.bounds;
  42. self.view.backgroundColor = [UIColor blackColor];
  43. [self build];
  44. [self prepareToRecord];
  45. _pSelf = self;
  46. return self;
  47. }
  48. -(void)dealloc{
  49. [self stop:nil];
  50. // [_mixRecorder release];
  51. // NSLog(@"recordAudioVC.dealloc");
  52. // [super dealloc];
  53. }
  54. -(void)build{
  55. _iv = [[JXImageView alloc] initWithFrame:CGRectMake(0, 0, JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT-200)];
  56. _iv.userInteractionEnabled = YES;
  57. [self.view addSubview:_iv];
  58. // [_iv release];
  59. _effectType = [[UIScrollView alloc] initWithFrame:CGRectMake(0, _iv.frame.size.height, JX_SCREEN_WIDTH, 80)];
  60. _effectType.backgroundColor = HEXCOLOR(0x111111);
  61. [self.view addSubview:_effectType];
  62. // [_effectType release];
  63. UIView* bottom = [[UIView alloc] initWithFrame:CGRectMake(0, _iv.frame.size.height+80, JX_SCREEN_WIDTH, 120)];
  64. bottom.backgroundColor = HEXCOLOR(0x111111);
  65. [self.view addSubview:bottom];
  66. // [bottom release];
  67. int n = 5;
  68. _effectType.contentSize = CGSizeMake((n+1) * 80, _effectType.frame.size.height);
  69. for(int i=0;i<n;i++){
  70. JXImageView* iv = [[JXImageView alloc]initWithFrame:CGRectMake(i*70+5, 2, 65, 65)];
  71. iv.delegate = self;
  72. iv.userInteractionEnabled = YES;
  73. iv.layer.cornerRadius = 6;
  74. iv.layer.masksToBounds = YES;
  75. iv.didTouch = @selector(onType);
  76. iv.animationType = JXImageView_Animation_Line;
  77. iv.tag = i;
  78. iv.image = [UIImage imageNamed:@"Accelerate_Audio"];
  79. [_effectType addSubview:iv];
  80. // [iv release];
  81. }
  82. _volume = [[JXImageView alloc]initWithFrame:CGRectMake(0, 0, 106/2, 192/2)];
  83. _volume.center = _iv.center;
  84. _volume.image = [UIImage imageNamed:@"pub_recorder"];
  85. [_iv addSubview:_volume];
  86. // [_volume release];
  87. _input = [[JXImageView alloc]initWithFrame:CGRectMake(9, 1, 34, 66)];//20,1,66,132
  88. _input.image = [UIImage imageNamed:@"pub_microphone_volume"];
  89. [_volume addSubview:_input];
  90. // [_input release];
  91. _btnPlay = [[JXImageView alloc]initWithFrame:CGRectMake(0, 0, 60, 60)];
  92. _btnPlay.center = _iv.center;
  93. _btnPlay.image = [UIImage imageNamed:@"rss_post_play"];
  94. _btnPlay.didTouch = @selector(onPlay);
  95. _btnPlay.delegate = self;
  96. [_iv addSubview:_btnPlay];
  97. // [_btnPlay release];
  98. _player = [[JXAudioPlayer alloc]initWithParent:_btnPlay];
  99. _player.isOpenProximityMonitoring = NO;
  100. _btnBack = [[JXImageView alloc]initWithFrame:CGRectMake(40, 30, 40, 40)];
  101. _btnBack.image = [UIImage imageNamed:@"navi_arrow_left_white"];
  102. _btnBack.didTouch = @selector(onBack);
  103. _btnBack.delegate = self;
  104. [bottom addSubview:_btnBack];
  105. // [_btnBack release];
  106. _btnDel = [[JXImageView alloc]initWithFrame:CGRectMake(40, 30, 40, 40)];
  107. _btnDel.image = [UIImage imageNamed:@"shareactivity_delete"];
  108. _btnDel.didTouch = @selector(onDel);
  109. _btnDel.delegate = self;
  110. [bottom addSubview:_btnDel];
  111. // [_btnDel release];
  112. _btnEnter = [[JXImageView alloc]initWithFrame:CGRectMake(JX_SCREEN_WIDTH-80, 30, 60, 60)];
  113. _btnEnter.image = [UIImage imageNamed:@"alert_tick"];
  114. _btnEnter.didTouch = @selector(onEnter);
  115. _btnEnter.delegate = self;
  116. [bottom addSubview:_btnEnter];
  117. // [_btnEnter release];
  118. _btnRecord = [[JXImageView alloc]initWithFrame:CGRectMake((JX_SCREEN_WIDTH-68)/2, 20, 68, 69)];
  119. _btnRecord.image = [UIImage imageNamed:@"publish_toolbar_record_normal"];
  120. _btnRecord.didTouch = @selector(onRecord);
  121. _btnRecord.delegate = self;
  122. [bottom addSubview:_btnRecord];
  123. // [_btnRecord release];
  124. _lb = [[UILabel alloc]initWithFrame:CGRectMake(0, JX_SCREEN_HEIGHT-20, JX_SCREEN_WIDTH, 20)];
  125. _lb.text = @"";
  126. _lb.font = g_UIFactory.font11;
  127. _lb.backgroundColor = [UIColor clearColor];
  128. _lb.textColor = [UIColor whiteColor];
  129. [bottom addSubview:_lb];
  130. // [_lb release];
  131. [self doShowBtn];
  132. }
  133. - (void)viewDidLoad
  134. {
  135. [super viewDidLoad];
  136. }
  137. - (void)didReceiveMemoryWarning
  138. {
  139. [super didReceiveMemoryWarning];
  140. // Dispose of any resources that can be recreated.
  141. }
  142. -(void) showVolPeak:(NSTimer *) timer {
  143. if(![_mixRecorder isPlaying])
  144. return;
  145. float n = [_mixRecorder displayInputLevelLeft]-0.13;
  146. float m = 1-n;
  147. _input.frame = CGRectMake(9, 1+66*m, 34, 66*n);
  148. _input.image = [UIImage imageNamed:@"pub_microphone_volume"];
  149. _input.image = [_input.image imageAtRect:CGRectMake(0, _input.image.size.height*m, _input.image.size.width, _input.image.size.height*n)];
  150. }
  151. - (IBAction) micFxSelectorChanged: (UISegmentedControl *) sender {
  152. NSInteger n = mFxType.selectedSegmentIndex;
  153. switch (n) {
  154. case 0:
  155. _mixRecorder.isEffecter = NO;
  156. // if(sender)
  157. // [self showMessage:@"本色演出,录音将不做特效处理" wait:3];
  158. break;
  159. case 1:
  160. _mixRecorder.isEffecter = YES;
  161. _mixRecorder.micFxType = 1;
  162. _mixRecorder.micFxControl = 0.8;
  163. // if(sender)
  164. // [self showMessage:@"录音将变化成女声,萌吗" wait:3];
  165. break;
  166. case 2:
  167. _mixRecorder.isEffecter = YES;
  168. _mixRecorder.micFxType = 2;
  169. _mixRecorder.micFxControl = 0.2;
  170. // if(sender)
  171. // [self showMessage:@"混响很小,模拟录音棚滋润音色" wait:3];
  172. break;
  173. case 3:
  174. _mixRecorder.isEffecter = YES;
  175. _mixRecorder.micFxType = 3;
  176. // if(sender)
  177. // [self showMessage:@"混响中等,模拟KTV大包房效果" wait:3];
  178. break;
  179. case 4:
  180. _mixRecorder.isEffecter = YES;
  181. _mixRecorder.micFxType = 4;
  182. // if(sender)
  183. // [self showMessage:@"混响较强,模拟演唱会的大空间和效果" wait:3];
  184. break;
  185. }
  186. }
  187. - (void)pause:(id)sender
  188. {
  189. if(_startOutput)
  190. return;
  191. [_mixRecorder pause];
  192. }
  193. /* Display AVMetadataCommonKeyTitle and AVMetadataCommonKeyCopyrights metadata. */
  194. - (void)stop:(id)sender
  195. {
  196. if ([_mixRecorder isPlaying])
  197. [_mixRecorder pause];
  198. [_mixRecorder stop];
  199. }
  200. -(void)prepareToRecord{
  201. _mixRecorder = [[MixerHostAudio alloc] init];
  202. _mixRecorder.isPlayer = NO;
  203. _mixRecorder.isIOS5 = YES;
  204. _mixRecorder.isIOS6 = YES;
  205. _mixRecorder.isRecorder = YES;
  206. _mixRecorder.isEffecter = YES;
  207. _mixRecorder.isMixSave = NO;
  208. _mixRecorder.isOutputer = YES;
  209. _mixRecorder.delegate = self;
  210. _mixRecorder.isPlayMic = NO;
  211. _mixRecorder.isReadFileToMemory = NO;
  212. [_mixRecorder setup];
  213. _mixRecorder.isEffecter = NO;
  214. // NSLog(@"%d,%d,%@",_mixRecorder.isPlayer,_mixRecorder.isMixSave,_mixRecorder.importAudioFile);
  215. [self micFxSelectorChanged:mFxType];
  216. _mixRecorder.outputAudioFile = [FileInfo getUUIDFileName:@"mp3"];
  217. _mixRecorder.volumeRecorder = 1;//必须在暂停前面
  218. [_mixRecorder pause];
  219. [_mixRecorder start];
  220. }
  221. -(NSString*)getHardwareId{
  222. char s[100]={0},t[100]={0};
  223. [g_macAddress getCString:s];
  224. int j=0;
  225. for(int i=0;i<strlen(s);i++){
  226. if(s[i] == ':')
  227. continue;
  228. else{
  229. t[j] = s[i];
  230. j++;
  231. }
  232. }
  233. return [NSString stringWithCString:t];
  234. }
  235. -(void)onDel{
  236. [_mixRecorder stop];
  237. [_mixRecorder delete];
  238. [_mixRecorder pause];
  239. [_mixRecorder start];
  240. }
  241. -(void)onPlay{
  242. // NSURL* url = [[NSURL alloc] initFileURLWithPath:_mixRecorder.outputAudioFile];
  243. _player.audioFile = _mixRecorder.outputAudioFile;
  244. }
  245. -(void)onBack{
  246. //返回前移除
  247. [self freeTimer];
  248. [_mixRecorder stop];
  249. [_mixRecorder delete];
  250. // [self.view removeFromSuperview];
  251. [g_navigation dismissViewController:self animated:YES];
  252. _pSelf = nil;
  253. // [self release];
  254. }
  255. -(void)doShowBtn{
  256. if(_btnRecord.selected){
  257. _volume.hidden = NO;
  258. _input.hidden = NO;
  259. _btnBack.hidden = YES;
  260. _btnDel.hidden = NO;
  261. _btnPlay.hidden = YES;
  262. _btnEnter.enabled = NO;
  263. }
  264. else{
  265. _volume.hidden = YES;
  266. _input.hidden = YES;
  267. _btnBack.hidden = NO;
  268. _btnDel.hidden = YES;
  269. _btnPlay.hidden = NO;
  270. _btnEnter.enabled = YES;
  271. }
  272. }
  273. -(void)onRecord{
  274. _btnRecord.selected = !_btnRecord.selected;
  275. [self doShowBtn];
  276. if(!_btnRecord.selected){
  277. _btnRecord.image = [UIImage imageNamed:@"publish_toolbar_record_normal"];
  278. [self freeTimer];
  279. [_mixRecorder pause];
  280. }
  281. else{
  282. _btnRecord.image = [UIImage imageNamed:@"pub_record_button_4i_h"];
  283. _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(showVolPeak:) userInfo:nil repeats: YES];
  284. [_mixRecorder play];
  285. }
  286. }
  287. -(void)onEnter{
  288. [self freeTimer];
  289. [_mixRecorder stop];
  290. self.outputFileName = _mixRecorder.outputAudioFile;
  291. self.timeLen = _mixRecorder.timeLenRecord;
  292. if (delegate && [delegate respondsToSelector:didRecord])
  293. // [delegate performSelector:didRecord withObject:self];
  294. [delegate performSelectorOnMainThread:didRecord withObject:self waitUntilDone:NO];
  295. // [g_notify postNotificationName:kNewAudioNotifaction object:_mixRecorder.outputAudioFile userInfo:nil];
  296. [self.view removeFromSuperview];
  297. _pSelf = nil;
  298. }
  299. -(void)freeTimer{
  300. [_timer invalidate];
  301. _timer = nil;
  302. }
  303. @end