2016-04-28 15 views
12

birden fazla ses oyuncuların hacmini kontrol ve DiracLE müzik çalarlar kullanarak bunu başarmak mümkün duyuyorum nasıl .Objective-C: Ben aynı anda birden fazla sesleri oynatmak için gereken ben <strong>Amaç C</strong> bir müzik uygulaması oluşturma DiracLE

Ancak bu Kitaplıktaki ses denetim yöntemini - (void) setVolume: (float) birimi; çalışmıyor görünüyor.

Benim Kod başlatılıyor DiracAudioPlayer için:

-(void)setPlayerVolume 
{ 
    [player1 setVolume:0.5]; 
    [player2 setVolume:0.2]; 
} 

setVolume : hayır bile tek bir oyuncu için çalışmıyor ve orada oyuncu hacimlerini ayarlamak için

DiracAudioPlayer *player1,*player2; 
NSURL *url1,*url2; 
NSError *error = nil; 

url1 = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"song1" ofType:@"mp3"]]; 
url2 = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"song2" ofType:@"mp3"]]; 

player1 = [[DiracAudioPlayer alloc] initWithContentsOfURL:mainURL channels:1 error:&error]; 
[player1 setDelegate:self]; 
player2 = [[DiracAudioPlayer alloc] initWithContentsOfURL:mainURL channels:1 error:&error]; 
[player2 setDelegate:self]; 

Yöntem istisnalar atılıyor.

Bu nasıl çözülür?

+0

Öyle mi (Bu iOS hacim değişikliğinin UI başlatacak) çözümümü dene İşe yaradı mı ? – Coder1000

+0

Üzgünüz .. O did değil –

+0

@Elly_Philip Çok kötü:/ – Coder1000

cevap

3

Ayrıca 2 AVAudioPlayers sırayla başlatılıyor ve sağ ile AudioUnit yeniden başlatmak için, kendi yöntemini kullanabilirsiniz DiracAudioPlayer kullanmaya kararlı olduklarını durumda [self.player setVolume:volumeFloat];

... 

    NSString *songA = [[NSBundle mainBundle] pathForResource:@"songA" ofType:@"mp3"]; 
    NSError *soundError = nil; 
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:songA] error:&soundError]; 
    if(self.player == nil) 
     NSLog(@"%@",soundError); 
    else 
    { 
     [self.player setDelegate:self]; 
     [self.player setVolume:0.75]; 
     [self.player play]; 
    } 

    NSString *songB = [[NSBundle mainBundle] pathForResource:@"songB" ofType:@"mp3"]; 
    soundError = nil; 
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:songB] error:&soundError]; 
    if(self.player == nil) 
     NSLog(@"%@",soundError); 
    else 
    { 
     [self.player setDelegate:self]; 
     [self.player setVolume:0.25]; 
     [self.player play]; 
    } 

... 

ile hacmini kontrol ederek bunu başarabilir DiracAudioPlayerBase.mm hacmi parametresi:

-(void)setupInstanceWithUrl:(NSURL*)inUrl numChannels:(int)channels volume:(float)volume 
{ 
    mDelegate = nil; 
    mInUrl = [inUrl copy]; 
    mIsPrepared = NO; 
    mIsProcessing = NO; 
    mWorkerThread = nil; 
    mTotalFramesInFile = 0; 
    mIsRunning = NO; 
    mVolume = volume; 
    mLoopCount = mNumberOfLoops = 0; 
    mHasFinishedPlaying = YES; 

    if (channels < 1) channels = 1; 
    else if (channels > 2) channels = 2; 
    mNumChannels = channels; 

    mPeak = new SInt16[mNumChannels]; 
    mPeakOut = new SInt16[mNumChannels]; 

    for (long v = 0; v < mNumChannels; v++) { 
     mPeakOut[v] = 0; 
     mPeak[v] = -1; 
    } 

    OSStatus status = noErr; 
    mTimeFactor = 1./kOversample; 
    mPitchFactor = kOversample; 
    // This is boilerplate code to set up CoreAudio on iOS in order to play audio via its default output 

    // Desired audio component 
    AudioComponentDescription desc; 
    desc.componentType = kAudioUnitType_Output; 
#if TARGET_OS_IPHONE 
    desc.componentSubType = kAudioUnitSubType_RemoteIO; 
#else 
    desc.componentSubType = kAudioUnitSubType_HALOutput; 
#endif 
    desc.componentManufacturer = kAudioUnitManufacturer_Apple; 
    desc.componentFlags = 0; 
    desc.componentFlagsMask = 0; 

    // Get ref to component 
    AudioComponent defaultOutput = AudioComponentFindNext(NULL, &desc); 

    // Get matching audio unit 
    status = AudioComponentInstanceNew(defaultOutput, &mAudioUnit); 
    checkStatus(status); 

    // this is the format we want 
    AudioStreamBasicDescription audioFormat; 
    mSampleRate=audioFormat.mSampleRate   = 44100.00; 
    audioFormat.mFormatID   = kAudioFormatLinearPCM; 
    audioFormat.mFormatFlags  = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
    audioFormat.mFramesPerPacket = 1; 
    audioFormat.mChannelsPerFrame = mNumChannels; 
    audioFormat.mBitsPerChannel  = 16; 
    audioFormat.mBytesPerPacket  = sizeof(short)*mNumChannels; 
    audioFormat.mBytesPerFrame  = sizeof(short)*mNumChannels; 

    status = AudioUnitSetProperty(mAudioUnit, 
            kAudioUnitProperty_StreamFormat, 
            kAudioUnitScope_Input, 
            kOutputBus, 
            &audioFormat, 
            sizeof(audioFormat)); 
    checkStatus(status); 

    // here we set up CoreAudio in order to call our PlaybackCallback 
    AURenderCallbackStruct callbackStruct; 
    callbackStruct.inputProc = PlaybackCallback; 
    callbackStruct.inputProcRefCon = (__bridge void*) self; 
    status = AudioUnitSetProperty(mAudioUnit, 
            kAudioUnitProperty_SetRenderCallback, 
            kAudioUnitScope_Input, 
            kOutputBus, 
            &callbackStruct, 
            sizeof(callbackStruct)); 
    checkStatus(status); 


    // Initialize unit 
    status = AudioUnitInitialize(mAudioUnit); 
    checkStatus(status); 

    // here we allocate our audio cache 
    mAudioBuffer = AllocateAudioBufferSInt16(mNumChannels, kAudioBufferNumFrames); 

    // Avoid delay when hitting play by making sure the graph is pre-initialized 
    AudioOutputUnitStart(mAudioUnit); 
    AudioOutputUnitStop(mAudioUnit); 

    [self prepareToPlay]; 

} 

toplu giriş yaparak ayarlanırken dikkatlice kontrol edin:

Ayrıca donanım ses düğmeleri tarafından kullanılan aynı yöntemle, karışımın çıkış ses seviyesini kontrol edebilir Yanı Sıra
NSLog(@"Volume P1: %f", [player1 volume]); 
NSLog(@"Volume P2: %f", [player2 volume]); 

:

-(void)addVolumeObserver { 

    MPVolumeView *volumeView = [MPVolumeView new]; 
    volumeView.showsRouteButton = NO; 
    volumeView.showsVolumeSlider = NO; 
    AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 
    [appDelegate.window.rootViewController.view addSubview:volumeView]; 


    __weak __typeof(self)weakSelf = self; 
    [[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     if ([obj isKindOfClass:[UISlider class]]) { 
      __strong __typeof(weakSelf)strongSelf = weakSelf; 
      strongSelf->volumeSlider = obj; 
      [obj addTarget:strongSelf action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged]; 
      *stop = YES; 
     } 
    }]; 
} 

- (void)handleVolumeChanged:(id)sender 
{ 
    NSLog(@"Volume: %f", volumeSlider.value); 
} 

- (void)setVolumeHandlerTo:(float)volume 
{ 
    volumeSlider.value = volume; 
} 
+0

Mümkünse bir downvote için bir neden istiyorum. Belki daha iyi bir çözüm sağlayabilir veya daha anlaşılır hale getirmek için cevabımı düzenleyebilirim. Teşekkürler –