Как убить звук, пока нажата следующая кнопка - PullRequest
0 голосов
/ 27 апреля 2018
@interface SpeechCommonFunctions : NSObject<AVAudioRecorderDelegate,AVAudioPlayerDelegate>
{
    AVAudioRecorder *recorder;

}
@property(strong,nonatomic)AVAudioPlayer *player;

@property(assign)BOOL isRecordComplete;

-(void)textToSpeechAction:(NSMutableArray *)imageStoreArray :(int)counter :(UIImageView *)imageChangeImageView :(UIImageView *)spekerOrMic :(BOOL)isMicPresent;

-(void)recordPlayAction;

@property(assign)BOOL isWritePresent;

speechclass: -

@ реализация SpeechCommonFunctions

-(void)textToSpeechAction:(NSMutableArray *)imageStoreArray :(int)counter :(UIImageView *)imageChangeImageView :(UIImageView *)spekerOrMic :(BOOL)isMicPresent
{
  //  spekerOrMic.image = [UIImage imageNamed:@"speaker.png"];
    NSArray *items = [[imageStoreArray objectAtIndex:counter] componentsSeparatedByString:@"."];
    NSString *speechString;
    if(_isWritePresent)
    {
       NSArray *viewToRemove = [spekerOrMic subviews];
        for (UIImageView *v in viewToRemove) {
          [v removeFromSuperview];
      }
      spekerOrMic.image = [UIImage imageNamed:@""];
        spekerOrMic.backgroundColor = [UIColor colorWithRed:41/255.0 green:52/255.0 blue:44/255.0 alpha:1.0];
        NSString *tempString = [items objectAtIndex:0];
        NSArray *tempArray = [tempString componentsSeparatedByString:@" "];
        speechString = [tempArray objectAtIndex:1];
    }
    else
    {
        speechString = [items objectAtIndex:0];
    }

    AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc]init];

    AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:speechString];



    [utterance setRate: 0.23f ];
   // utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"];
     utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"];
    [synthesizer speakUtterance:utterance];

    imageChangeImageView.image = [UIImage imageNamed:[imageStoreArray objectAtIndex:counter]];


    //if the record there then only use it....



    if(isMicPresent)
  {
     [NSTimer scheduledTimerWithTimeInterval:NO target:self selector:@selector(micAction:) userInfo:spekerOrMic repeats:NO];
   }
}

-(void)micAction:(NSTimer *)timer
{
    NSLog(@"mic action");
    UIImageView *micOrSpeaker = timer.userInfo ;
    micOrSpeaker.image = [UIImage imageNamed:@"mic.png"];
   // Set the audio file
  NSArray *pathComponents = [NSArray arrayWithObjects:
                               [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject],
                               @"MyAudioMemo.m4a",
                               nil];
   NSURL *outputFileURL = [NSURL fileURLWithPathComponents:pathComponents];

    // Setup audio session
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

    // Define the recorder setting
    NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];

    [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
    [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];

    // Initiate and prepare the recorder
    recorder = [[AVAudioRecorder alloc] initWithURL:outputFileURL settings:recordSetting error:NULL];
    recorder.delegate = self;
    recorder.meteringEnabled = YES;
    [recorder prepareToRecord];

    [recorder record];

    [NSTimer scheduledTimerWithTimeInterval:NO target:self selector:@selector(recordStopAction:) userInfo:micOrSpeaker repeats:NO];
}

-(void)recordStopAction:(NSTimer *)timer
{
    NSLog(@"stop");
    [recorder stop];
    UIImageView *micOrSpeaker = timer.userInfo;
    micOrSpeaker.image = [UIImage imageNamed:@""];

    _isRecordComplete = YES;

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setActive:NO error:nil];
}

-(void)recordPlayAction
{
    if (!recorder.recording){
        _player = [[AVAudioPlayer alloc] initWithContentsOfURL:recorder.url error:nil];
        [_player setDelegate:self];
        [_player play];
    }
}

@end

и я вызвал функцию в своем классе, как показано ниже .....

        [commonFunctionObject textToSpeechAction:numbersStoreArray :counter :_numbersShowImageView :_speakerOrMicImageView :isMicPresent];
        [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(ActionToCkeckRecordCompletion) userInfo:nil repeats:YES];
-(void)ActionToCkeckRecordCompletion
{
    if(commonFunctionObject.isRecordComplete)
    {
        _confirmationPopupView.hidden = false;
    }
}
- (IBAction)nextButtonAction:(id)sender
{
    counter+=1;
    _confirmationPopupView.hidden = true;
    commonFunctionObject.isRecordComplete = NO;
    if(commonFunctionObject.player.playing){[commonFunctionObject.player stop];}
    [self repeatActionFire];
}

- (IBAction)retryButtonAction:(id)sender
{

    counter+=-1;
    if(counter==-1){
        [self viewDidLoad];
    }
    else{
        //  _confirmationPopupView.hidden = true;
        commonFunctionObject.isRecordComplete = NO;
        if(commonFunctionObject.player.playing){[commonFunctionObject.player stop];}

        [self repeatActionFire];
    }

}

массив как: -

 numbersStoreArray = [[NSMutableArray alloc]initWithObjects:@"1.png",@"2.png",@"3.png",@"4.png",@"5.png",@"6.png",@"7.png",@"8.png",@"9.png",@"10.png", nil];

Здесь я получил вывод ... Но когда я быстро нажал на следующую кнопку, изображение меняется, но звук не приходит. Так что, как сделать. И я думаю, что в этом есть какой-то нежелательный код. Поэтому, пожалуйста, дайте решение.

...