Перейти к содержанию
Fire Monkey от А до Я
  • 0

Помогите разобраться с кодом C#


XXXXXX

Вопрос

Помогите пожалуйста разобраться с кодом С#, в коде загружается dll и используются функции из неё, хочу перевести на дельфи.

 

загрузка dll


        [DllImport("opus.dll", CallingConvention = CallingConvention.Cdecl)]
        internal static extern IntPtr opus_decoder_create(int Fs, int channels, out IntPtr error);

        [DllImport("opus.dll", CallingConvention = CallingConvention.Cdecl)]
        internal static extern void opus_decoder_destroy(IntPtr decoder);

        [DllImport("opus.dll", CallingConvention = CallingConvention.Cdecl)]
        internal static extern int opus_decode(IntPtr st, byte[] data, int len, byte[] pcm, int frame_size, int decode_fec);

      
 public static OpusDecoder Create(int outputSampleRate, int outputChannels)
        {
            if (outputSampleRate != 8000 &&
                outputSampleRate != 12000 &&
                outputSampleRate != 16000 &&
                outputSampleRate != 24000 &&
                outputSampleRate != 48000)
                throw new ArgumentOutOfRangeException("inputSamplingRate");
            if (outputChannels != 1 && outputChannels != 2)
                throw new ArgumentOutOfRangeException("inputChannels");

            IntPtr error;
            
            IntPtr decoder = API.opus_decoder_create(outputSampleRate, outputChannels, out error);
            if ((Errors)error != Errors.OK)
            {
                throw new Exception("Exception occured while creating decoder");
            }
            return new OpusDecoder(decoder, outputSampleRate, outputChannels);
        }
  public unsafe byte[] Decode(byte[] inputOpusData, int dataLength, out int decodedLength)
        {
            if (disposed)
                throw new ObjectDisposedException("OpusDecoder");

            byte[] decoded = new byte[MaxDataBytes];
            int frameCount = FrameCount(MaxDataBytes);
            int length = 0;

                if (inputOpusData != null)
                    length = API.opus_decode(_decoder, inputOpusData, dataLength, decoded, frameCount, 0);
                else
                    length = API.opus_decode(_decoder, null, 0, decoded, frameCount, (ForwardErrorCorrection) ? 1 : 0);

            decodedLength = length * 2;
            if (length < 0)
                throw new Exception("Decoding failed - " + ((Errors)length).ToString());

            return decoded;
        }
private void button3_Click(object sender, EventArgs e)
        {
            OpusDecoder _dec= OpusDecoder.Create(48000, 1);
            byte[] segDec = new byte[4000];
            byte[] seg = new byte[4000];
            seg[0] = 8;
            seg[1] = 11;
            seg[2] = 230;
            seg[3] = 61;
            seg[4] = 36;
            seg[5] = 236;
            seg[6] = 195;
            seg[7] = 220;
            seg[8] = 192;
            int len = 9;
            segDec = _dec.Decode(seg, len, out len);
        }

код на C# работает, но когда перевожу его на дельфи он начинает ругаться "stackoverflow"

 

загрузка dll

 function   opus_decoder_create(Fs:LongInt; channels:Integer; var Error:Integer):OpusDecoder; cdecl; external 'opus.dll';
     function   opus_decode(st:OpusDecoder; data:array of Byte; len:Integer;var pcm: array of Byte; frame_size: Integer; decode_fec:Integer):Integer; cdecl; external 'opus.dll';
     procedure  opus_decoder_destroy(st:OpusEncoder); cdecl; external 'opus.dll';

использование функций

procedure TMain.Decode_2Click(Sender: TObject);
var
  OPDecoder: OpusDecoder;
  Error: Integer;
  PreEnc:array of Byte;
  PreDec:array of Byte;
begin
  Error := 0 ;
  OPDecoder := opus_decoder_create(48000, 1, Error);
  SetLength(PreEnc, 4000);
  SetLength(PreDec, 4000);
  PreEnc[0] := 8;
  PreEnc[1] := 11;
  PreEnc[2] := 230;
  PreEnc[3] := 61;
  PreEnc[4] := 36;
  PreEnc[5] := 236;
  PreEnc[6] := 195;
  PreEnc[7] := 220;
  PreEnc[8] := 192;

  Error := opus_decode(OPDecoder, PreEnc, 9, PreDec, 2000, 0);
end;

в процедуру dll ки значения подаются одинаковые в обеих случаях, никак не могу разобраться в чём дело.

Изменено пользователем Alexander616
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

лабороторные работы чтоль?

:D  нет, занимаюсь одним проектом, с передачей аудио с андроида на комп и наоборот по сети. Ну, в принципе всё работает, вот только проблема появляется при плохом интернете. Поэтому решили закодировать поток при помощи кодека.

Изменено пользователем Alexander616
Ссылка на комментарий
  • 0

Ты с ума сошёл в функцию массивы передавать  :)

 

Замени

function opus_decode(st:OpusDecoder; data:array of Byte; len:Integer;var pcm: array of Byte; frame_size: Integer; decode_fec:Integer):Integer; cdecl; external 'opus.dll';

на

function opus_decode(st: OpusDecoder; data: PByte; len: Integer; pcm: PByte; frame_size: Integer; decode_fec: Integer):Integer; cdecl; external 'opus.dll';

Прототип функции ты неверно объявил. Дальше вызываешь функцию так:

Error := opus_decode(OPDecoder, @PreEnc[0], 9, @PreDec[0], 2000, 0);
Изменено пользователем Pulsarius
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...