определение SDL_LoadWAV_RW
говорит
Эта функция, если она успешно вызвана, возвращает указатель на структуру SDL_AudioSpec, заполненную форматом аудиоданных данных источника волны,audio_buf заполняется указателем на выделенный буфер, содержащий аудиоданные, а audio_len заполняется длиной этого аудиобуфера в байтах.
, что означает, что вызываемая функция выделяет требуемую память и заполняетзатем он возвращает указатели на выделенную память и ее длину.
Таким образом, привязка, с которой вы работаете, не очень хорошая Ada.
audio_buf
должна быть out
параметр в массив байтов, audio_len
и out
параметр в Uint32
.
В качестве демонстрации, используя эту C:
#include <stdlib.h>
void get_data (char **buf, int *len)
{
*len = 10;
*buf = malloc(*len);
for (int j = 0; j < *len; j++) {
(*buf)[j] = j;
}
}
эту Аду
type Raw is array (Interfaces.Unsigned_32) of Interfaces.Unsigned_8
with Convention => C;
определяет тип массива (который занимал бы 2 ^ 32-1 байта, если бы мы фактически объявили один!), А этот
type Raw_P is access all Raw
with Convention => C, Storage_Size => 0;
определяет указатель на такой массив. Ограничение размера хранилища до 0 означает, что мы не можем сказать new Raw_P
.
Собрав их вместе,
with Ada.Text_IO; use Ada.Text_IO;
with Interfaces;
procedure Demo is
type Raw is array (Interfaces.Unsigned_32) of Interfaces.Unsigned_8
with Convention => C;
type Raw_P is access all Raw
with Convention => C, Storage_Size => 0;
procedure Get_Data (In_Buffer : out Raw_P;
Length : out Interfaces.Unsigned_32)
with
Import,
Convention => C,
External_Name => "get_data";
Allocated : Raw_P;
Length : Interfaces.Unsigned_32;
use type Interfaces.Unsigned_32;
begin
Get_Data (In_Buffer => Allocated,
Length => Length);
for J in 0 .. Length - 1 loop
Put (Allocated (J)'Image);
end loop;
New_Line;
end Demo;
дает программу, которая при запуске приводит к
$ ./demo
0 1 2 3 4 5 6 7 8 9
$
----
Признавая, что вы, вероятно, застряли с
audio_buf : System.Address;
, вы можете определить (или использовать, если уже определено) что-то вроде моего Raw
, Raw_P
и скажите
procedure Get_Data (In_Buffer : System.Address;
Length : out Interfaces.Unsigned_32)
with
Import,
Convention => C,
External_Name => "get_data";
, а затем используйте
Get_Data (In_Buffer => Allocated'Address,
Length => Length);