// Called when new audio is passed to player for playback. // Initializes all asset dependent members excluding stream dependent members private void InitAudio(urakawa.media.data.audio.AudioMediaData audio) { this.audio = audio; WaveFormat format = new WaveFormat(); BufferDescription desc = new BufferDescription(); urakawa.media.data.audio.PCMFormatInfo info = audio.getPCMFormat(); this.frameSize = info.getBlockAlign(); this.channels = info.getNumberOfChannels(); this.sampleRate = (int)info.getSampleRate(); format.AverageBytesPerSecond = (int)info.getSampleRate() * info.getBlockAlign(); format.BitsPerSample = Convert.ToInt16(info.getBitDepth()); format.BlockAlign = Convert.ToInt16(info.getBlockAlign()); format.Channels = Convert.ToInt16(info.getNumberOfChannels()); format.FormatTag = WaveFormatTag.Pcm; format.SamplesPerSecond = (int)info.getSampleRate(); desc.Format = format; this.bufferSize = format.AverageBytesPerSecond; this.refreshLength = this.bufferSize / 2; desc.BufferBytes = this.bufferSize; desc.GlobalFocus = true; this.soundBuffer = new SecondaryBuffer(desc, this.device); this.pausePosition = 0; this.previousPosition = 0; }
/// <summary> /// Play an asset from a specified time position its to end /// </summary> public void Play(urakawa.media.data.audio.AudioMediaData audio, double from) { if (this.state == PlayerState.Stopped || this.state == PlayerState.Paused) { if (audio != null && audio.getAudioDuration().getTimeDeltaAsMillisecondFloat() > 0) { urakawa.media.data.audio.PCMFormatInfo info = audio.getPCMFormat(); int position = CalculationFunctions.AdaptToFrame( CalculationFunctions.ConvertTimeToByte(from, (int)info.getSampleRate(), info.getBlockAlign()), info.getBlockAlign()); if (position >= 0 && position <= audio.getPCMLength()) { this.startPosition = position; InitPlay(audio, position, 0); } else { throw new Exception("Start Position is out of bounds of Audio Asset"); } } } }