using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using System;
|
|
namespace UnityOpus {
|
public class Decoder : IDisposable {
|
public const int maximumPacketDuration = Library.maximumPacketDuration;
|
|
IntPtr decoder;
|
readonly NumChannels channels;
|
readonly float[] softclipMem;
|
|
public Decoder(
|
SamplingFrequency samplingFrequency,
|
NumChannels channels) {
|
ErrorCode error;
|
this.channels = channels;
|
decoder = Library.OpusDecoderCreate(
|
samplingFrequency,
|
channels,
|
out error);
|
if (error != ErrorCode.OK) {
|
Debug.LogError("[UnityOpus] Failed to create Decoder. Error code is " + error.ToString());
|
decoder = IntPtr.Zero;
|
}
|
softclipMem = new float[(int)channels];
|
}
|
|
public int Decode(
|
byte[] data,
|
int dataLength,
|
short[] pcm,
|
int decodeFec = 0) {
|
if (decoder == IntPtr.Zero) {
|
return 0;
|
}
|
var decodedLength = Library.OpusDecode(
|
decoder,
|
data,
|
dataLength,
|
pcm,
|
160,//pcm.Length / (int)channels,
|
decodeFec);
|
//Library.OpusPcmSoftClip(
|
// pcm,
|
// decodedLength / (int)channels,
|
// channels,
|
// softclipMem);
|
return decodedLength;
|
}
|
|
#region IDisposable Support
|
private bool disposedValue = false; // 重複する呼び出しを検出するには
|
|
protected virtual void Dispose(bool disposing) {
|
if (!disposedValue) {
|
if (decoder == IntPtr.Zero) {
|
return;
|
}
|
Library.OpusDecoderDestroy(decoder);
|
decoder = IntPtr.Zero;
|
|
disposedValue = true;
|
}
|
}
|
|
~Decoder() {
|
Dispose(false);
|
}
|
|
public void Dispose() {
|
Dispose(true);
|
GC.SuppressFinalize(this);
|
}
|
#endregion
|
}
|
}
|