2012-09-07 26 views
7

Akış modunda farklı sesler çalmak için Ses parçasını kullanıyorum. Her sesin ne zaman biteceğini/sona erdiğini bilmenin bir yolu olup olmadığını bilmek istiyorum.AudioTrack - bir sesin ne zaman başlayacağını/bittiğini nasıl anlarsınız?

AudioTrack tmpAudioTrack = new AudioTrack(
     STREAM_TYPE, 
     SAMPLE_RATE, 
     CHANNEL_CONFIG_TYPE, 
      AUDIO_FORMAT_TYPE, 
     getOptimalBufferSize(), 
     AUDIO_TRACK_MODE);' 

Ve arka plan iş parçacığı başlatmak:

böyle ses oluşturmak

backround_thread = new Thread(new MyRunnable(aTrack)); 
    backround_thread.start(); 

ben çalıştırılabilir içi şöyle her sesi yazma:

byte generatedSnd[] = new byte[2 * beepSamples]; 
<code for filling the buffer with sound here> 
int bytesWritten = track.write(generatedSnd, 0, generatedSnd.length); 

Bu setNotificationMarkerPosition veya setLoopPoints gibi AudioTrack API'lerinden herhangi birini kullanmak mümkündür veya se tPositionNotificationPeriod bunu başarmak için? ve nasıl çalışırlar?

Her ses farklı bir süre olabilir. Bence bu anahtar.

Bu API'ların belgelerini tam olarak anlamıyorum. Her çerçeve bir örnekle aynı mıdır? Her sesin nerede başladığını/sonlandırılacağını nasıl belirtebilirim?

Teşekkürler,

+0

En azından setNotificationMarkerPosition ve setPositionNotificationPeriod arasındaki farkı bilen var mı? – mikemeli

cevap

12

Bu, öğrendiklerimiz.

Bana göre çerçeveler örneklerdir. Bu, sesin süresi, çarpım oranının çarpımına eşittir.

AudioTrack setPositionNotificationPeriod'u kullanmak için, bir miktar örnek iletirsiniz. Eğer 200 örnek geçerseniz, geri arama her 200 örnekte tekrar çağrılacaktır.

tmpAudioTrack.setPositionNotificationPeriod(duration * sampleRate); 

setNotificationMarkerPosition'ı kullanmak için, ayrıca bir miktar örnek de iletirsiniz. Ancak, bu mutlak ve dönem API'sine benzer değil. Bir sesin ne zaman biteceğini belirlemek istiyorsanız, örnek miktarını (toplam ses kaydı süresi * sampleRate) iletirsiniz.

tmpAudioTrack.setNotificationMarkerPosition(duration * sampleRate); 

Ama, zaten oynuyorsanız, ses parçanın ortasında ve en geç 3 saniye diyelim böylece geri çağırdı alacak bir işaretçi eklemek istiyorsunuz, o zaman akımı eklemek gerekir böyle ses, oynatma kafasının: (sizin süresi 3 saniye)

tmpAudioTrack.setNotificationMarkerPosition(tmpAudioTrack.getPlaybackHeadPosition() + (duration * sampleRate)); 

ve bu dönemi ve işaretleyici bildirimleri için kayıtlı olsun nasıl. ILLUSTRATORNG.