From 07e7b817c59c3dce263bfb89b51248316c343f0e Mon Sep 17 00:00:00 2001 From: Jedidiah Barber Date: Mon, 7 Oct 2024 19:51:28 +1300 Subject: Now using Integer_Address for C interface --- src/c_portadao.c | 6 +++ src/c_portadao.h | 3 ++ src/portaudio-devices.adb | 8 +-- src/portaudio-streams.adb | 132 +++++++++++++++++++++++----------------------- src/portaudio-streams.ads | 4 +- src/portaudio.adb | 11 ++-- src/portaudio.ads | 20 ++++++- 7 files changed, 105 insertions(+), 79 deletions(-) diff --git a/src/c_portadao.c b/src/c_portadao.c index d664b69..53b22a3 100644 --- a/src/c_portadao.c +++ b/src/c_portadao.c @@ -88,6 +88,12 @@ const unsigned long pa_priming_output = paPrimingOutput; +size_t c_pointer_size() { + return sizeof(void*); +} + + + int fd_backup; int suppressed = 0; diff --git a/src/c_portadao.h b/src/c_portadao.h index 9bcd3be..bee7a5c 100644 --- a/src/c_portadao.h +++ b/src/c_portadao.h @@ -85,6 +85,9 @@ extern const unsigned long pa_output_overflow; extern const unsigned long pa_priming_output; +size_t c_pointer_size(); + + int apa_init(int msg); int apa_term(); diff --git a/src/portaudio-devices.adb b/src/portaudio-devices.adb index 7e0e5e6..aa697ad 100644 --- a/src/portaudio-devices.adb +++ b/src/portaudio-devices.adb @@ -45,7 +45,7 @@ package body Portaudio.Devices is function pa_get_host_api_info (Index : in Interfaces.C.int) - return System.Address; + return Storage.Integer_Address; pragma Import (C, pa_get_host_api_info, "Pa_GetHostApiInfo"); function pa_host_api_type_id_to_host_api_index @@ -74,7 +74,7 @@ package body Portaudio.Devices is function pa_get_device_info (Index : in Interfaces.C.int) - return System.Address; + return Storage.Integer_Address; pragma Import (C, pa_get_device_info, "Pa_GetDeviceInfo"); @@ -288,7 +288,7 @@ package body Portaudio.Devices is is Result : System.Address; begin - Result := pa_get_host_api_info (Interfaces.C.int (Index) - 1); + Result := Storage.To_Address (pa_get_host_api_info (Interfaces.C.int (Index) - 1)); if Result = System.Null_Address then raise General_Failure; else @@ -375,7 +375,7 @@ package body Portaudio.Devices is is Result : System.Address; begin - Result := pa_get_device_info (Interfaces.C.int (Index) - 1); + Result := Storage.To_Address (pa_get_device_info (Interfaces.C.int (Index) - 1)); if Result = System.Null_Address then raise General_Failure; else diff --git a/src/portaudio-streams.adb b/src/portaudio-streams.adb index ed837b9..070da8b 100644 --- a/src/portaudio-streams.adb +++ b/src/portaudio-streams.adb @@ -84,108 +84,108 @@ package body Portaudio.Streams is ------------------------ function pa_is_format_supported - (Input : in System.Address; - Output : in System.Address; + (Input : in Storage.Integer_Address; + Output : in Storage.Integer_Address; Rate : in Interfaces.C.double) return Interfaces.C.int; pragma Import (C, pa_is_format_supported, "Pa_IsFormatSupported"); function pa_open_stream - (Stream : in out System.Address; - In_Params : in System.Address; - Out_Params : in System.Address; + (Stream : in out Storage.Integer_Address; + In_Params : in Storage.Integer_Address; + Out_Params : in Storage.Integer_Address; Rate : in Interfaces.C.double; Frames : in Interfaces.C.unsigned_long; Flags : in Interfaces.C.unsigned_long; - Callback : in System.Address; - Userdata : in System.Address) + Callback : in Storage.Integer_Address; + Userdata : in Storage.Integer_Address) return Interfaces.C.int; pragma Import (C, pa_open_stream, "Pa_OpenStream"); function pa_open_default_stream - (Stream : in out System.Address; + (Stream : in out Storage.Integer_Address; In_Chans : in Interfaces.C.int; Out_Chans : in Interfaces.C.int; Format : in Interfaces.C.unsigned_long; Rate : in Interfaces.C.double; Frames : in Interfaces.C.unsigned_long; - Callback : in System.Address; - Userdata : in System.Address) + Callback : in Storage.Integer_Address; + Userdata : in Storage.Integer_Address) return Interfaces.C.int; pragma Import (C, pa_open_default_stream, "Pa_OpenDefaultStream"); function pa_close_stream - (Stream : in System.Address) + (Stream : in Storage.Integer_Address) return Interfaces.C.int; pragma Import (C, pa_close_stream, "Pa_CloseStream"); function pa_set_stream_finished_callback - (Stream : in System.Address; - Callback : in System.Address) + (Stream : in Storage.Integer_Address; + Callback : in Storage.Integer_Address) return Interfaces.C.int; pragma Import (C, pa_set_stream_finished_callback, "Pa_SetStreamFinishedCallback"); function pa_start_stream - (Stream : in System.Address) + (Stream : in Storage.Integer_Address) return Interfaces.C.int; pragma Import (C, pa_start_stream, "Pa_StartStream"); function pa_stop_stream - (Stream : in System.Address) + (Stream : in Storage.Integer_Address) return Interfaces.C.int; pragma Import (C, pa_stop_stream, "Pa_StopStream"); function pa_abort_stream - (Stream : in System.Address) + (Stream : in Storage.Integer_Address) return Interfaces.C.int; pragma Import (C, pa_abort_stream, "Pa_AbortStream"); function pa_is_stream_stopped - (Stream : in System.Address) + (Stream : in Storage.Integer_Address) return Interfaces.C.int; pragma Import (C, pa_is_stream_stopped, "Pa_IsStreamStopped"); function pa_is_stream_active - (Stream : in System.Address) + (Stream : in Storage.Integer_Address) return Interfaces.C.int; pragma Import (C, pa_is_stream_active, "Pa_IsStreamActive"); function pa_get_stream_info - (Stream : in System.Address) - return System.Address; + (Stream : in Storage.Integer_Address) + return Storage.Integer_Address; pragma Import (C, pa_get_stream_info, "Pa_GetStreamInfo"); function pa_get_stream_time - (Stream : in System.Address) + (Stream : in Storage.Integer_Address) return Interfaces.C.double; pragma Import (C, pa_get_stream_time, "Pa_GetStreamTime"); function pa_get_stream_cpu_load - (Stream : in System.Address) + (Stream : in Storage.Integer_Address) return Interfaces.C.double; pragma Import (C, pa_get_stream_cpu_load, "Pa_GetStreamCpuLoad"); function pa_read_stream - (Stream : in System.Address; - Buffer : in System.Address; + (Stream : in Storage.Integer_Address; + Buffer : in Storage.Integer_Address; Frames : in Interfaces.C.unsigned_long) return Interfaces.C.int; pragma Import (C, pa_read_stream, "Pa_ReadStream"); function pa_write_stream - (Stream : in System.Address; - Buffer : in System.Address; + (Stream : in Storage.Integer_Address; + Buffer : in Storage.Integer_Address; Frames : in Interfaces.C.unsigned_long) return Interfaces.C.int; pragma Import (C, pa_write_stream, "Pa_WriteStream"); function pa_get_stream_read_available - (Stream : in System.Address) + (Stream : in Storage.Integer_Address) return Interfaces.C.long; pragma Import (C, pa_get_stream_read_available, "Pa_GetStreamReadAvailable"); function pa_get_stream_write_available - (Stream : in System.Address) + (Stream : in Storage.Integer_Address) return Interfaces.C.long; pragma Import (C, pa_get_stream_write_available, "Pa_GetStreamWriteAvailable"); @@ -584,7 +584,7 @@ package body Portaudio.Streams is My_Channels => Interfaces.C.int (Channels), My_Samples => To_Cnum (Format), My_Latency => Interfaces.C.double (Latency), - My_Specific => System.Null_Address); + My_Specific => Null_Pointer); end Create; @@ -630,8 +630,8 @@ package body Portaudio.Streams is Param_Conversions.To_Address (Param_Conversions.Object_Pointer (Output)); begin Code := pa_is_format_supported - (Input_Address, - Output_Address, + (Storage.To_Integer (Input_Address), + Storage.To_Integer (Output_Address), Interfaces.C.double (Rate)); return Code = pa_format_is_supported; end Is_Format_Supported; @@ -648,13 +648,13 @@ package body Portaudio.Streams is begin Code := pa_open_stream (Stream.Ptr, - Input_Params'Address, - System.Null_Address, + Storage.To_Integer (Input_Params'Address), + Null_Pointer, Interfaces.C.double (Sample_Rate), Interfaces.C.unsigned_long (Buffer_Frames), Interfaces.C.unsigned_long (Bunting), - Stream_Callback_Hook'Address, - Stream'Address); + Storage.To_Integer (Stream_Callback_Hook'Address), + Storage.To_Integer (Stream'Address)); if Code /= pa_no_error then Raise_Error (Code); raise Program_Error; @@ -678,13 +678,13 @@ package body Portaudio.Streams is begin Code := pa_open_stream (Stream.Ptr, - System.Null_Address, - Output_Params'Address, + Null_Pointer, + Storage.To_Integer (Output_Params'Address), Interfaces.C.double (Sample_Rate), Interfaces.C.unsigned_long (Buffer_Frames), Interfaces.C.unsigned_long (Bunting), - Stream_Callback_Hook'Address, - Stream'Address); + Storage.To_Integer (Stream_Callback_Hook'Address), + Storage.To_Integer (Stream'Address)); if Code /= pa_no_error then Raise_Error (Code); raise Program_Error; @@ -709,13 +709,13 @@ package body Portaudio.Streams is begin Code := pa_open_stream (Stream.Ptr, - Input_Params'Address, - Output_Params'Address, + Storage.To_Integer (Input_Params'Address), + Storage.To_Integer (Output_Params'Address), Interfaces.C.double (Sample_Rate), Interfaces.C.unsigned_long (Buffer_Frames), Interfaces.C.unsigned_long (Bunting), - Stream_Callback_Hook'Address, - Stream'Address); + Storage.To_Integer (Stream_Callback_Hook'Address), + Storage.To_Integer (Stream'Address)); if Code /= pa_no_error then Raise_Error (Code); raise Program_Error; @@ -740,13 +740,13 @@ package body Portaudio.Streams is begin Code := pa_open_stream (Stream.Ptr, - Input_Params'Address, - System.Null_Address, + Storage.To_Integer (Input_Params'Address), + Null_Pointer, Interfaces.C.double (Sample_Rate), Interfaces.C.unsigned_long (Buffer_Frames), Interfaces.C.unsigned_long (Bunting), - System.Null_Address, - System.Null_Address); + Null_Pointer, + Null_Pointer); if Code /= pa_no_error then Raise_Error (Code); raise Program_Error; @@ -766,13 +766,13 @@ package body Portaudio.Streams is begin Code := pa_open_stream (Stream.Ptr, - System.Null_Address, - Output_Params'Address, + Null_Pointer, + Storage.To_Integer (Output_Params'Address), Interfaces.C.double (Sample_Rate), Interfaces.C.unsigned_long (Buffer_Frames), Interfaces.C.unsigned_long (Bunting), - System.Null_Address, - System.Null_Address); + Null_Pointer, + Null_Pointer); if Code /= pa_no_error then Raise_Error (Code); raise Program_Error; @@ -793,13 +793,13 @@ package body Portaudio.Streams is begin Code := pa_open_stream (Stream.Ptr, - Input_Params'Address, - Output_Params'Address, + Storage.To_Integer (Input_Params'Address), + Storage.To_Integer (Output_Params'Address), Interfaces.C.double (Sample_Rate), Interfaces.C.unsigned_long (Buffer_Frames), Interfaces.C.unsigned_long (Bunting), - System.Null_Address, - System.Null_Address); + Null_Pointer, + Null_Pointer); if Code /= pa_no_error then Raise_Error (Code); raise Program_Error; @@ -826,8 +826,8 @@ package body Portaudio.Streams is To_Cnum (Format), Interfaces.C.double (Sample_Rate), Interfaces.C.unsigned_long (Buffer_Frames), - Stream_Callback_Hook'Address, - Stream'Address); + Storage.To_Integer (Stream_Callback_Hook'Address), + Storage.To_Integer (Stream'Address)); if Code /= pa_no_error then Raise_Error (Code); raise Program_Error; @@ -858,8 +858,8 @@ package body Portaudio.Streams is To_Cnum (Format), Interfaces.C.double (Sample_Rate), Interfaces.C.unsigned_long (Buffer_Frames), - System.Null_Address, - System.Null_Address); + Null_Pointer, + Null_Pointer); if Code /= pa_no_error then Raise_Error (Code); raise Program_Error; @@ -895,7 +895,7 @@ package body Portaudio.Streams is Stream.Finfun := Callback; Code := pa_set_stream_finished_callback (Stream.Ptr, - Stream_Finished_Callback_Hook'Address); + Storage.To_Integer (Stream_Finished_Callback_Hook'Address)); if Code /= pa_no_error then Raise_Error (Code); raise Program_Error; @@ -909,7 +909,7 @@ package body Portaudio.Streams is begin Code := pa_set_stream_finished_callback (Stream.Ptr, - System.Null_Address); + Null_Pointer); if Code /= pa_no_error then Raise_Error (Code); raise Program_Error; @@ -990,15 +990,15 @@ package body Portaudio.Streams is (Stream : in Audio_Stream) return Stream_Info is - Result : System.Address; + Result : Storage.Integer_Address; begin Result := pa_get_stream_info (Stream.Ptr); - if Result = System.Null_Address then + if Result = Null_Pointer then raise General_Failure; else declare C_Data : C_Stream_Info; - for C_Data'Address use Result; + for C_Data'Address use Storage.To_Address (Result); pragma Import (Ada, C_Data); begin return @@ -1039,7 +1039,7 @@ package body Portaudio.Streams is begin Code := pa_read_stream (Stream.Ptr, - Store.My_Array, + Storage.To_Integer (Store.My_Array), Interfaces.C.unsigned_long (Frames)); if Code /= pa_no_error then Raise_Error (Code); @@ -1056,7 +1056,7 @@ package body Portaudio.Streams is begin Code := pa_write_stream (Stream.Ptr, - Store.My_Array, + Storage.To_Integer (Store.My_Array), Interfaces.C.unsigned_long (Frames)); if Code /= pa_no_error then Raise_Error (Code); diff --git a/src/portaudio-streams.ads b/src/portaudio-streams.ads index 0f3d2ba..4a431b8 100644 --- a/src/portaudio-streams.ads +++ b/src/portaudio-streams.ads @@ -482,7 +482,7 @@ private My_Channels : Interfaces.C.int; My_Samples : Interfaces.C.unsigned_long; My_Latency : Interfaces.C.double; - My_Specific : System.Address; + My_Specific : Storage.Integer_Address; end record with Convention => C; @@ -506,7 +506,7 @@ private type Audio_Stream is tagged limited record - Ptr : System.Address; + Ptr : Storage.Integer_Address; Open : Boolean := False; Callfun : Callback_Function; Finfun : Stream_Finished_Function; diff --git a/src/portaudio.adb b/src/portaudio.adb index 2ed90ea..1b23daa 100644 --- a/src/portaudio.adb +++ b/src/portaudio.adb @@ -10,8 +10,7 @@ pragma Ada_2012; with Ada.Strings.Fixed, - Interfaces.C.Strings, - System.Address_To_Access_Conversions; + Interfaces.C.Strings; use type @@ -176,7 +175,7 @@ package body Portaudio is pragma Import (C, pa_get_version, "Pa_GetVersion"); function pa_get_version_info - return System.Address; + return Storage.Integer_Address; pragma Import (C, pa_get_version_info, "Pa_GetVersionInfo"); function pa_get_error_text @@ -194,7 +193,7 @@ package body Portaudio is pragma Import (C, pa_terminate, "apa_term"); function pa_get_last_host_error_info - return System.Address; + return Storage.Integer_Address; pragma Import (C, pa_get_last_host_error_info, "Pa_GetLastHostErrorInfo"); @@ -213,7 +212,7 @@ package body Portaudio is elsif Num = pa_unanticipated_host_error then declare Info : C_Host_Error_Info; - for Info'Address use pa_get_last_host_error_info; + for Info'Address use Storage.To_Address (pa_get_last_host_error_info); pragma Import (Ada, Info); begin raise Unanticipated_Host_Error with @@ -559,7 +558,7 @@ package body Portaudio is function Get_Version_Info return Version_Info is begin - return (Ptr => pa_get_version_info); + return (Ptr => Storage.To_Address (pa_get_version_info)); end Get_Version_Info; diff --git a/src/portaudio.ads b/src/portaudio.ads index 2744047..282f994 100644 --- a/src/portaudio.ads +++ b/src/portaudio.ads @@ -11,7 +11,7 @@ private with Ada.Finalization, Interfaces.C.Strings, - System; + System.Storage_Elements; package Portaudio is @@ -190,9 +190,27 @@ package Portaudio is private + package Storage renames System.Storage_Elements; + use type Interfaces.C.size_t, Storage.Integer_Address; + + + Null_Pointer : constant Storage.Integer_Address := Storage.To_Integer (System.Null_Address); + + pragma Linker_Options ("-lportaudio"); + function c_pointer_size + return Interfaces.C.size_t; + pragma Import (C, c_pointer_size, "c_pointer_size"); + + -- If this fails then we are on an architecture that for whatever reason + -- has significant problems interfacing between C and Ada + pragma Assert + (c_pointer_size * Interfaces.C.CHAR_BIT = Storage.Integer_Address'Size, + "Size of C void pointers and size of Ada address values do not match"); + + type C_Version_Info is record My_Major : Interfaces.C.int; My_Minor : Interfaces.C.int; -- cgit