-- Programmed by Jedidiah Barber -- Released into the public domain with Ada.Characters.Latin_1, Ada.Text_IO, Portaudio; use type Portaudio.Device_Index, Portaudio.Time; procedure Device_List is package Latin renames Ada.Characters.Latin_1; package TIO renames Ada.Text_IO; package Paud renames Portaudio; function Image (Num : in Integer) return String is Test_Out : String := Integer'Image (Num); begin if Test_Out (Test_Out'First) = ' ' then return Test_Out (Test_Out'First + 1 .. Test_Out'Last); else return Test_Out; end if; end Image; function Image (Num : in Paud.Time) return String is begin if Num < 0.0 then return "N/A"; else return Paud.Image (Num * 1000.0) & "ms"; end if; end Image; function Image (Num : in Paud.Hertz) return String is begin return Paud.Hertz_Image (Num / 1000.0) & "kHz"; end Image; procedure Put_Supported_Standard_Sample_Rates (In_Params : access Paud.Stream_Parameters; Out_Params : access Paud.Stream_Parameters) is Standard_Sample_Rates : array (Positive range <>) of Paud.Hertz := (8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 192000.0); Put_Counter : Natural := 0; begin for Rate of Standard_Sample_Rates loop if Paud.Is_Format_Supported (In_Params, Out_Params, Rate) then case Put_Counter is when 0 => TIO.Put (Latin.HT & Image (Rate)); Put_Counter := 1; when 4 => TIO.Put (Latin.LF & Latin.HT & Image (Rate)); Put_Counter := 1; when others => TIO.Put (", " & Image (Rate)); Put_Counter := Put_Counter + 1; end case; end if; end loop; if Put_Counter = 0 then TIO.Put_Line ("None"); else TIO.New_Line; end if; end Put_Supported_Standard_Sample_Rates; Num_Devices : Natural; Current_Device : Paud.Device_Info; Current_Host_API : Paud.Host_API_Info; Displayed_Default : Boolean; Input_Params : aliased Paud.Stream_Parameters; Output_Params : aliased Paud.Stream_Parameters; begin TIO.Put_Line ("PortAudio version: " & Paud.Image (Paud.Get_Version)); TIO.Put_Line ("Version text: " & Paud.Get_Version_Info.Text); Num_Devices := Paud.Get_Device_Count; TIO.Put_Line ("Number of devices = " & Image (Num_Devices)); for Index in Paud.Device_Index (1) .. Paud.Device_Index (Num_Devices) loop Current_Device := Paud.Get_Device_Info (Index); Current_Host_API := Paud.Get_Host_API_Info (Current_Device.Host_API); Displayed_Default := False; TIO.New_Line; TIO.Put_Line ("--------------------------------------- device #" & Image (Integer (Index))); if Index = Paud.Get_Default_Input_Device then TIO.Put ("[ Default Input"); Displayed_Default := True; elsif Index = Current_Host_API.Default_Input_Device then TIO.Put ("[ Default " & Current_Host_API.Name & " Input"); Displayed_Default := True; end if; if Index = Paud.Get_Default_Output_Device then if Displayed_Default then TIO.Put (","); else TIO.Put ("["); end if; TIO.Put (" Default Output"); Displayed_Default := True; elsif Index = Current_Host_API.Default_Output_Device then if Displayed_Default then TIO.Put (","); else TIO.Put ("["); end if; TIO.Put (" Default " & Current_Host_API.Name & " Output"); Displayed_Default := True; end if; if Displayed_Default then TIO.Put_Line (" ]"); end if; TIO.Put_Line ("Name = " & Current_Device.Name); TIO.Put_Line ("Host API = " & Current_Host_API.Name); TIO.Put_Line ("Max inputs = " & Image (Current_Device.Max_Input_Channels) & ", Max outputs = " & Image (Current_Device.Max_Output_Channels)); TIO.Put_Line ("Default low input latency = " & Image (Current_Device.Default_Low_Input_Latency)); TIO.Put_Line ("Default low output latency = " & Image (Current_Device.Default_Low_Output_Latency)); TIO.Put_Line ("Default high input latency = " & Image (Current_Device.Default_High_Input_Latency)); TIO.Put_Line ("Default high output latency = " & Image (Current_Device.Default_High_Output_Latency)); TIO.Put_Line ("Default sample rate = " & Image (Current_Device.Default_Sample_Rate)); Input_Params := Paud.Create (Index, Current_Device.Max_Input_Channels, Paud.Int_16_Sample, 0.0); Output_Params := Paud.Create (Index, Current_Device.Max_Output_Channels, Paud.Int_16_Sample, 0.0); if Current_Device.Max_Input_Channels > 0 then TIO.Put_Line ("Supported standard sample rates"); TIO.Put_Line (" for half-duplex 16 bit " & Image (Current_Device.Max_Input_Channels) & " channel input ="); Put_Supported_Standard_Sample_Rates (Input_Params'Access, null); end if; if Current_Device.Max_Output_Channels > 0 then TIO.Put_Line ("Supported standard sample rates"); TIO.Put_Line (" for half-duplex 16 bit " & Image (Current_Device.Max_Output_Channels) & " channel output ="); Put_Supported_Standard_Sample_Rates (null, Output_Params'Access); end if; if Current_Device.Max_Input_Channels > 0 and Current_Device.Max_Output_Channels > 0 then TIO.Put_Line ("Supported standard sample rates"); TIO.Put_Line (" for full-duplex 16 bit " & Image (Current_Device.Max_Input_Channels) & " channel input, " & Image (Current_Device.Max_Output_Channels) & " channel output ="); Put_Supported_Standard_Sample_Rates (Input_Params'Access, Output_Params'Access); end if; end loop; TIO.New_Line; TIO.Put_Line ("----------------------------------------------"); end Device_List;