byte[] processPacket(byte[] alacFrame) { if (alacFrame == null) { return(silence); } int[] outBuffer = new int[(audioSession.FrameSize + 3) * 2]; int outputsize = AlacDecodeUtils.DecodeFrame(audioSession.AlacFile, alacFrame, outBuffer); if (outputsize != audioSession.FrameSize * 4) { Logger.Warn("Alac Decoder: Unexpected audio frame size. Expected: {0}, Actual: {1}", audioSession.FrameSize * 4, outputsize); } int actualDataLength; if (manageBuffer) { int[] output = new int[outBuffer.Length]; actualDataLength = stuffBuffer(audioSession.Filter.PlaybackRate, outBuffer, output) * 2; outBuffer = output; } else { actualDataLength = audioSession.FrameSize * 2; } byte[] pcmData = new byte[actualDataLength * 2]; int j = 0; for (int i = 0; i < actualDataLength; i++) { //PCM data is received in big endian - we need little pcmData[j++] = (byte)(outBuffer[i]); pcmData[j++] = (byte)(outBuffer[i] >> 8); } return(pcmData); }
AlacFile createAlac() { if (sampleSize != 16) { return(null); } AlacFile alac = AlacDecodeUtils.create_alac(sampleSize, 2); alac.setinfo_max_samples_per_frame = frameSize; alac.setinfo_7a = _7a; alac.setinfo_sample_size = sampleSize; alac.setinfo_rice_historymult = rice_historymult; alac.setinfo_rice_initialhistory = rice_initialhistory; alac.setinfo_rice_kmodifier = rice_kmodifier; alac.setinfo_7f = channels; alac.setinfo_80 = _80; alac.setinfo_82 = _82; alac.setinfo_86 = _86; alac.setinfo_8a_rate = sampleRate; return(alac); }