1. -- 
  2. -- Copyright (c) 2013 Kevin Wellwood 
  3. -- All rights reserved. 
  4. -- 
  5. -- This source code is distributed under the Modified BSD License. For terms and 
  6. -- conditions, see license.txt. 
  7. -- 
  8.  
  9. with Allegro.Events;                    use Allegro.Events; 
  10. with Allegro.File_IO;                   use Allegro.File_IO; 
  11. with Interfaces;                        use Interfaces; 
  12. with Interfaces.C;                      use Interfaces.C; 
  13. with System;                            use System; 
  14.  
  15. -- Allegro 5.0.9 - Audio 
  16. package Allegro.Audio is 
  17.  
  18.     -- Audio types 
  19.  
  20.     type Allegro_Audio_Depth is ( 
  21.         ALLEGRO_AUDIO_DEPTH_INT8, 
  22.         ALLEGRO_AUDIO_DEPTH_INT16, 
  23.         ALLEGRO_AUDIO_DEPTH_INT24, 
  24.         ALLEGRO_AUDIO_DEPTH_FLOAT32, 
  25.         ALLEGRO_AUDIO_DEPTH_UINT8, 
  26.         ALLEGRO_AUDIO_DEPTH_UINT16, 
  27.         ALLEGRO_AUDIO_DEPTH_UINT24 
  28.     ); 
  29.     for Allegro_Audio_Depth use ( 
  30.         ALLEGRO_AUDIO_DEPTH_INT8     =>  0, 
  31.         ALLEGRO_AUDIO_DEPTH_INT16    =>  1, 
  32.         ALLEGRO_AUDIO_DEPTH_INT24    =>  2, 
  33.         ALLEGRO_AUDIO_DEPTH_FLOAT32  =>  3, 
  34.         ALLEGRO_AUDIO_DEPTH_UINT8    =>  8,  -- ALLEGRO_AUDIO_DEPTH_INT8   or 8 
  35.         ALLEGRO_AUDIO_DEPTH_UINT16   =>  9,  -- ALLEGRO_AUDIO_DEPTH_INT24  or 8 
  36.         ALLEGRO_AUDIO_DEPTH_UINT24   => 10   -- ALLEGRO_AUDIO_DEPTH_UINT24 or 8 
  37.     ); 
  38.     pragma Convention( C, Allegro_Audio_Depth ); 
  39.  
  40.     type Allegro_Audio_Pan is new Float; 
  41.  
  42.     Allegro_Audio_Pan_None : constant Allegro_Audio_Pan := -1000.0; 
  43.  
  44.     type Allegro_Channel_Conf is ( 
  45.         ALLEGRO_CHANNEL_CONF_1, 
  46.         ALLEGRO_CHANNEL_CONF_2, 
  47.         ALLEGRO_CHANNEL_CONF_3, 
  48.         ALLEGRO_CHANNEL_CONF_4, 
  49.         ALLEGRO_CHANNEL_CONF_5_1, 
  50.         ALLEGRO_CHANNEL_CONF_6_1, 
  51.         ALLEGRO_CHANNEL_CONF_7_1 
  52.     ); 
  53.     for Allegro_Channel_Conf use ( 
  54.         ALLEGRO_CHANNEL_CONF_1   => 16#10#, 
  55.         ALLEGRO_CHANNEL_CONF_2   => 16#20#, 
  56.         ALLEGRO_CHANNEL_CONF_3   => 16#30#, 
  57.         ALLEGRO_CHANNEL_CONF_4   => 16#40#, 
  58.         ALLEGRO_CHANNEL_CONF_5_1 => 16#51#, 
  59.         ALLEGRO_CHANNEL_CONF_6_1 => 16#61#, 
  60.         ALLEGRO_CHANNEL_CONF_7_1 => 16#71# 
  61.     ); 
  62.     pragma Convention( C, Allegro_Channel_Conf ); 
  63.  
  64.     ALLEGRO_MAX_CHANNELS : constant := 8; 
  65.  
  66.     type Allegro_Mixer is limited private; 
  67.     type A_Allegro_Mixer is access all Allegro_Mixer; 
  68.  
  69.     type Allegro_Mixer_Quality is ( 
  70.         ALLEGRO_MIXER_QUALITY_POINT, 
  71.         ALLEGRO_MIXER_QUALITY_LINEAR, 
  72.         ALLEGRO_MIXER_QUALITY_CUBIC 
  73.     ); 
  74.     for Allegro_Mixer_Quality use ( 
  75.         ALLEGRO_MIXER_QUALITY_POINT  => 16#110#, 
  76.         ALLEGRO_MIXER_QUALITY_LINEAR => 16#111#, 
  77.         ALLEGRO_MIXER_QUALITY_CUBIC  => 16#112# 
  78.     ); 
  79.     pragma Convention( C, Allegro_Mixer_Quality ); 
  80.  
  81.     type Allegro_Playmode is ( 
  82.         ALLEGRO_PLAYMODE_ONCE, 
  83.         ALLEGRO_PLAYMODE_LOOP, 
  84.         ALLEGRO_PLAYMODE_BIDIR 
  85.     ); 
  86.     for Allegro_Playmode use ( 
  87.         ALLEGRO_PLAYMODE_ONCE  => 16#100#, 
  88.         ALLEGRO_PLAYMODE_LOOP  => 16#101#, 
  89.         ALLEGRO_PLAYMODE_BIDIR => 16#102# 
  90.     ); 
  91.     pragma Convention( C, Allegro_Playmode ); 
  92.  
  93.     ALLEGRO_EVENT_AUDIO_STREAM_FRAGMENT : constant Allegro_Event_Type := 513; 
  94.     ALLEGRO_EVENT_AUDIO_STREAM_FINISHED : constant Allegro_Event_Type := 514; 
  95.  
  96.     type Allegro_Sample_Id is 
  97.         record 
  98.             index : Integer; 
  99.             id    : Integer; 
  100.         end record; 
  101.     pragma Convention( C, Allegro_Sample_Id ); 
  102.  
  103.     type Allegro_Sample is limited private; 
  104.     type A_Allegro_Sample is access all Allegro_Sample; 
  105.  
  106.     type Allegro_Sample_Instance is limited private; 
  107.     type A_Allegro_Sample_Instance is access all Allegro_Sample_Instance; 
  108.  
  109.     type Allegro_Audio_Stream is limited private; 
  110.     type A_Allegro_Audio_Stream is access all Allegro_Audio_Stream; 
  111.  
  112.     type Allegro_Voice is limited private; 
  113.     type A_Allegro_Voice is access all Allegro_Voice; 
  114.  
  115.     -- Setting up audio 
  116.  
  117.     function Al_Install_Audio return Boolean; 
  118.  
  119.     procedure Al_Uninstall_Audio; 
  120.     pragma Import( C, Al_Uninstall_Audio, "al_uninstall_audio" ); 
  121.  
  122.     function Al_Is_Audio_Installed return Boolean; 
  123.  
  124.     function Al_Reserve_Samples( reserve_samples : Integer ) return Boolean; 
  125.  
  126.     -- Misc audio functions 
  127.  
  128.     function Al_Get_Allegro_Audio_Version return Unsigned_32; 
  129.     pragma Import( C, Al_Get_Allegro_Audio_Version, "al_get_allegro_audio_version" ); 
  130.  
  131.     function Al_Get_Audio_Depth_Size( conf : Allegro_Audio_Depth ) return size_t; 
  132.     pragma Import( C, Al_Get_Audio_Depth_Size, "al_get_audio_depth_size" ); 
  133.  
  134.     function Al_Get_Channel_Count( conf : Allegro_Channel_Conf ) return size_t; 
  135.     pragma Import( C, Al_Get_Channel_Count, "al_get_channel_count" ); 
  136.  
  137.     -- Voice functions 
  138.  
  139.     function Al_Create_Voice( freq      : unsigned; 
  140.                               depth     : Allegro_Audio_Depth; 
  141.                               chan_conf : Allegro_Channel_Conf ) return A_Allegro_Voice; 
  142.     pragma Import( C, Al_Create_Voice, "al_create_voice" ); 
  143.  
  144.     procedure Al_Destroy_Voice( voice : in out A_Allegro_Voice ); 
  145.  
  146.     procedure Al_Detach_Voice( voice : A_Allegro_Voice ); 
  147.     pragma Import( C, Al_Detach_Voice, "al_detach_voice" ); 
  148.  
  149.     function Al_Attach_Audio_Stream_To_Voice( stream : A_Allegro_Audio_Stream; 
  150.                                               voice  : A_Allegro_Voice ) return Boolean; 
  151.  
  152.     function Al_Attach_Mixer_To_Voice( mixer : A_Allegro_Mixer; 
  153.                                        voice : A_Allegro_Voice ) return Boolean; 
  154.  
  155.     function Al_Attach_Sample_Instance_To_Voice( stream : A_Allegro_Sample_Instance; 
  156.                                                  voice  : A_Allegro_Voice ) return Boolean; 
  157.  
  158.     function Al_Get_Voice_Frequency( voice : A_Allegro_Voice ) return unsigned; 
  159.     pragma Import( C, Al_Get_Voice_Frequency, "al_get_voice_frequency" ); 
  160.  
  161.     function Al_Get_Voice_Depth( voice : A_Allegro_Voice ) return Allegro_Audio_Depth; 
  162.     pragma Import( C, Al_Get_Voice_Depth, "al_get_voice_depth" ); 
  163.  
  164.     function Al_Get_Voice_Channels( voice : A_Allegro_Voice ) return Allegro_Channel_Conf; 
  165.     pragma Import( C, Al_Get_Voice_Channels, "al_get_voice_channels" ); 
  166.  
  167.     function Al_Get_Voice_Playing( voice : A_Allegro_Voice ) return Boolean; 
  168.  
  169.     function Al_Set_Voice_Playing( voice : A_Allegro_Voice; val : Boolean ) return Boolean; 
  170.  
  171.     function Al_Get_Voice_Position( voice : A_Allegro_Voice ) return unsigned; 
  172.     pragma Import( C, Al_Get_Voice_Position, "al_get_voice_position" ); 
  173.  
  174.     function Al_Set_Voice_Position( voice : A_Allegro_Voice; val : unsigned ) return Boolean; 
  175.  
  176.     -- Sample functions 
  177.  
  178.     function Al_Create_Sample( buf       : Address; 
  179.                                samples   : unsigned; 
  180.                                freq      : unsigned; 
  181.                                depth     : Allegro_Audio_Depth; 
  182.                                chan_conf : Allegro_Channel_Conf; 
  183.                                free_buf  : Boolean ) return A_Allegro_Sample; 
  184.  
  185.     procedure Al_Destroy_Sample( spl : in out A_Allegro_Sample ); 
  186.     pragma Postcondition( spl = null ); 
  187.  
  188.     function Al_Play_Sample( data     : A_Allegro_Sample; 
  189.                              gain     : Float; 
  190.                              pan      : Float; 
  191.                              speed    : Float; 
  192.                              playMode : Allegro_Playmode; 
  193.                              ret_id   : access Allegro_Sample_Id ) return Boolean; 
  194.  
  195.     procedure Al_Stop_Sample( spl_id : Allegro_Sample_Id ); 
  196.     pragma Import( C, Al_Stop_Sample, "al_stop_sample" ); 
  197.  
  198.     procedure Al_Stop_Samples; 
  199.     pragma Import( C, Al_Stop_Samples, "al_stop_samples" ); 
  200.  
  201.     function Al_Get_Sample_Channels( spl : A_Allegro_Sample ) return Allegro_Channel_Conf; 
  202.     pragma Import( C, Al_Get_Sample_Channels, "al_get_sample_channels" ); 
  203.  
  204.     function Al_Get_Sample_Depth( spl : A_Allegro_Sample ) return Allegro_Audio_Depth; 
  205.     pragma Import( C, Al_Get_Sample_Depth, "al_get_sample_depth" ); 
  206.  
  207.     function Al_Get_Sample_Frequency( spl : A_Allegro_Sample ) return unsigned; 
  208.     pragma Import( C, Al_Get_Sample_Frequency, "al_get_sample_depth" ); 
  209.  
  210.     function Al_Get_Sample_Length( spl : A_Allegro_Sample ) return unsigned; 
  211.     pragma Import( C, Al_Get_Sample_Length, "al_get_sample_length" ); 
  212.  
  213.     function Al_Get_Sample_Data( spl : A_Allegro_Sample ) return Address; 
  214.     pragma Import( C, Al_Get_Sample_Data, "al_get_sample_data" ); 
  215.  
  216.     -- Sample instance functions 
  217.  
  218.     function Al_Create_Sample_Instance( data : A_Allegro_Sample ) return A_Allegro_Sample_Instance; 
  219.     pragma Import( C, Al_Create_Sample_Instance, "al_create_sample_instance" ); 
  220.  
  221.     procedure Al_Destroy_Sample_Instance( spl : in out A_Allegro_Sample_Instance ); 
  222.  
  223.     function Al_Play_Sample_Instance( spl : A_Allegro_Sample_Instance ) return Boolean; 
  224.  
  225.     function Al_Stop_Sample_Instance( spl : A_Allegro_Sample_Instance ) return Boolean; 
  226.  
  227.     function Al_Get_Sample_Instance_Channels( spl : A_Allegro_Sample_Instance ) return Allegro_Channel_Conf; 
  228.     pragma Import( C, Al_Get_Sample_Instance_Channels, "al_get_sample_instance_channels" ); 
  229.  
  230.     function Al_Get_Sample_Instance_Depth( spl : A_Allegro_Sample_Instance ) return Allegro_Audio_Depth; 
  231.     pragma Import( C, Al_Get_Sample_Instance_Depth, "al_get_sample_instance_depth" ); 
  232.  
  233.     function Al_Get_Sample_Instance_Frequency( spl : A_Allegro_Sample_Instance ) return unsigned; 
  234.     pragma Import( C, Al_Get_Sample_Instance_Frequency, "al_get_sample_instance_frequency" ); 
  235.  
  236.     function Al_Get_Sample_Instance_Length( spl : A_Allegro_Sample_Instance ) return unsigned; 
  237.     pragma Import( C, Al_Get_Sample_Instance_Length, "al_get_sample_instance_length" ); 
  238.  
  239.     function Al_Set_Sample_Instance_Length( spl : A_Allegro_Sample_Instance; 
  240.                                             val : unsigned ) return Boolean; 
  241.  
  242.     function Al_Get_Sample_Instance_Position( spl : A_Allegro_Sample_Instance ) return unsigned; 
  243.     pragma Import( C, Al_Get_Sample_Instance_Position, "al_get_sample_instance_position" ); 
  244.  
  245.     function Al_Set_Sample_Instance_Position( spl : A_Allegro_Sample_Instance; val : unsigned ) return Boolean; 
  246.  
  247.     function Al_Get_Sample_Instance_Speed( spl : A_Allegro_Sample_Instance ) return Float; 
  248.     pragma Import( C, Al_Get_Sample_Instance_Speed, "al_get_sample_instance_speed" ); 
  249.  
  250.     function Al_Set_Sample_Instance_Speed( spl : A_Allegro_Sample_Instance; val : Float ) return Boolean; 
  251.  
  252.     function Al_Get_Sample_Instance_Gain( spl : A_Allegro_Sample_Instance ) return Float; 
  253.     pragma Import( C, Al_Get_Sample_Instance_Gain, "al_get_sample_instance_gain" ); 
  254.  
  255.     function Al_Set_Sample_Instance_Gain( spl : A_Allegro_Sample_Instance; val : Float ) return Boolean; 
  256.  
  257.     function Al_Get_Sample_Instance_Pan( spl : A_Allegro_Sample_Instance ) return Float; 
  258.     pragma Import( C, Al_Get_Sample_Instance_Pan, "al_get_sample_instance_pan" ); 
  259.  
  260.     function Al_Set_Sample_Instance_Pan( spl : A_Allegro_Sample_Instance; val : Float ) return Boolean; 
  261.  
  262.     function Al_Get_Sample_Instance_Time( spl : A_Allegro_Sample_Instance ) return Float; 
  263.     pragma Import( C, Al_Get_Sample_Instance_Time, "al_get_sample_instance_time" ); 
  264.  
  265.     function Al_Get_Sample_Instance_Playmode( spl : A_Allegro_Sample_Instance ) return Allegro_Playmode; 
  266.     pragma Import( C, Al_Get_Sample_Instance_Playmode, "al_get_sample_instance_playmode" ); 
  267.  
  268.     function Al_Set_Sample_Instance_Playmode( spl : A_Allegro_Sample_Instance; 
  269.                                               val : Allegro_Playmode ) return Boolean; 
  270.  
  271.     function Al_Get_Sample_Instance_Playing( spl : A_Allegro_Sample_Instance ) return Boolean; 
  272.  
  273.     function Al_Set_Sample_Instance_Playing( spl : A_Allegro_Sample_Instance; 
  274.                                              val : Boolean ) return Boolean; 
  275.  
  276.     procedure Al_Set_Sample_Instance_Playing( spl : A_Allegro_Sample_Instance; 
  277.                                               val : Boolean ); 
  278.  
  279.     function Al_Get_Sample_Instance_Attached( spl : A_Allegro_Sample_Instance ) return Boolean; 
  280.  
  281.     function Al_Detach_Sample_Instance( spl : A_Allegro_Sample_Instance ) return Boolean; 
  282.  
  283.     procedure Al_Detach_Sample_Instance( spl : A_Allegro_Sample_Instance ); 
  284.  
  285.     function Al_Get_Sample( spl : A_Allegro_Sample_Instance ) return A_Allegro_Sample; 
  286.     pragma Import( C, Al_Get_Sample, "al_get_sample" ); 
  287.  
  288.     function Al_Set_Sample( spl  : A_Allegro_Sample_Instance; 
  289.                             data : A_Allegro_Sample ) return Boolean; 
  290.  
  291.     -- Mixer functions 
  292.  
  293.     function Al_Create_Mixer( freq      : unsigned; 
  294.                               depth     : Allegro_Audio_Depth; 
  295.                               chan_conf : Allegro_Channel_Conf ) return A_Allegro_Mixer; 
  296.     pragma Import( C, Al_Create_Mixer, "al_create_mixer" ); 
  297.  
  298.     procedure Al_Destroy_Mixer( mixer : in out A_Allegro_Mixer ); 
  299.  
  300.     function Al_Get_Default_Mixer return A_Allegro_Mixer; 
  301.     pragma Import( C, Al_Get_Default_Mixer, "al_get_default_mixer" ); 
  302.  
  303.     function Al_Set_Default_Mixer( mixer : A_Allegro_Mixer ) return Boolean; 
  304.  
  305.     procedure Al_Set_Default_Mixer( mixer : A_Allegro_Mixer ); 
  306.  
  307.     function Al_Restore_Default_Mixer return Boolean; 
  308.  
  309.     function Al_Attach_Mixer_To_Mixer( stream : A_Allegro_Mixer; 
  310.                                        mixer  : A_Allegro_Mixer ) return Boolean; 
  311.  
  312.     function Al_Attach_Sample_Instance_To_Mixer( stream : A_Allegro_Sample_Instance; 
  313.                                                  mixer  : A_Allegro_Mixer ) return Boolean; 
  314.  
  315.     function Al_Attach_Audio_Stream_To_Mixer( stream : A_Allegro_Audio_Stream; 
  316.                                               mixer  : A_Allegro_Mixer ) return Boolean; 
  317.  
  318.     function Al_Get_Mixer_Frequency( mixer : A_Allegro_Mixer ) return unsigned; 
  319.     pragma Import( C, Al_Get_Mixer_Frequency, "al_get_mixer_frequency" ); 
  320.  
  321.     function Al_Set_Mixer_Frequency( mixer : A_Allegro_Mixer; 
  322.                                      val   : unsigned ) return Boolean; 
  323.  
  324.     function Al_Get_Mixer_Channels( mixer : A_Allegro_Mixer ) return Allegro_Channel_Conf; 
  325.     pragma Import( C, Al_Get_Mixer_Channels, "al_get_mixer_channels" ); 
  326.  
  327.     function Al_Get_Mixer_Depth( mixer : A_Allegro_Mixer ) return Allegro_Audio_Depth; 
  328.     pragma Import( C, Al_Get_Mixer_Depth, "al_get_mixer_depth" ); 
  329.  
  330.     function Al_Get_Mixer_Quality( mixer : A_Allegro_Mixer ) return Allegro_Mixer_Quality; 
  331.     pragma Import( C, Al_Get_Mixer_Quality, "al_get_mixer_quality" ); 
  332.  
  333.     function Al_Set_Mixer_Quality( mixer : A_Allegro_Mixer; 
  334.                                    val   : Allegro_Mixer_Quality ) return Boolean; 
  335.  
  336.     function Al_Get_Mixer_Gain( mixer : A_Allegro_Mixer ) return Float; 
  337.     pragma Import( C, Al_Get_Mixer_Gain, "al_get_mixer_gain" ); 
  338.  
  339.     function Al_Set_Mixer_Gain( mixer : A_Allegro_Mixer; 
  340.                                 val   : Float ) return Boolean; 
  341.  
  342.     function Al_Get_Mixer_Playing( mixer : A_Allegro_Mixer ) return Boolean; 
  343.  
  344.     function Al_Set_Mixer_Playing( mixer : A_Allegro_Mixer; val : Boolean ) return Boolean; 
  345.  
  346.     function Al_Get_Mixer_Attached( mixer : A_Allegro_Mixer ) return Boolean; 
  347.  
  348.     function Al_Detach_Mixer( mixer : A_Allegro_Mixer ) return Boolean; 
  349.  
  350.     type A_Mixer_Postprocess_Callback is access 
  351.          procedure( buf : Address; samples : unsigned; data : Address ); 
  352.     pragma Convention( C, A_Mixer_Postprocess_Callback ); 
  353.  
  354.     function Al_Set_Mixer_Postprocess_Callback( mixer : A_Allegro_Mixer; 
  355.                                                 cb    : A_Mixer_Postprocess_Callback; 
  356.                                                 data  : Address ) return Boolean; 
  357.  
  358.     -- Stream functions 
  359.  
  360.     function Al_Create_Audio_Stream( buffer_count : size_t; 
  361.                                      samples      : unsigned; 
  362.                                      freq         : unsigned; 
  363.                                      depth        : Allegro_Audio_Depth; 
  364.                                      chan_conf    : Allegro_Channel_Conf 
  365.                                    ) return A_Allegro_Audio_Stream; 
  366.     pragma Import( C, Al_Create_Audio_Stream, "al_create_audio_stream" ); 
  367.  
  368.     procedure Al_Destroy_Audio_Stream( stream : in out A_Allegro_Audio_Stream ); 
  369.  
  370.     function Al_Get_Audio_Stream_Event_Source( stream : A_Allegro_Audio_Stream ) return A_Allegro_Event_Source; 
  371.     pragma Import( C, Al_Get_Audio_Stream_Event_Source, "al_get_audio_stream_event_source" ); 
  372.  
  373.     procedure Al_Drain_Audio_Stream( stream : A_Allegro_Audio_Stream ); 
  374.     pragma Import( C, Al_Drain_Audio_Stream, "al_drain_audio_stream" ); 
  375.  
  376.     function Al_Rewind_Audio_Stream( stream : A_Allegro_Audio_Stream ) return Boolean; 
  377.  
  378.     function Al_Get_Audio_Stream_Frequency( stream : A_Allegro_Audio_Stream ) return unsigned; 
  379.     pragma Import( C, Al_Get_Audio_Stream_Frequency, "al_get_audio_stream_frequency" ); 
  380.  
  381.     function Al_Get_Audio_Stream_Channels( stream : A_Allegro_Audio_Stream ) return Allegro_Channel_Conf; 
  382.     pragma Import( C, Al_Get_Audio_Stream_Channels, "al_get_audio_stream_channels" ); 
  383.  
  384.     function Al_Get_Audio_Stream_Depth( stream : A_Allegro_Audio_Stream ) return Allegro_Audio_Depth; 
  385.     pragma Import( C, Al_Get_Audio_Stream_Depth, "al_get_audio_stream_depth" ); 
  386.  
  387.     function Al_Get_Audio_Stream_Length( stream : A_Allegro_Audio_Stream ) return unsigned; 
  388.     pragma Import( C, Al_Get_Audio_Stream_Length, "al_get_audio_stream_length" ); 
  389.  
  390.     function Al_Get_Audio_Stream_Speed( stream : A_Allegro_Audio_Stream ) return Float; 
  391.     pragma Import( C, Al_Get_Audio_Stream_Speed, "al_get_audio_stream_speed" ); 
  392.  
  393.     function Al_Set_Audio_Stream_Speed( stream : A_Allegro_Audio_Stream; 
  394.                                         val    : Float ) return Boolean; 
  395.  
  396.     function Al_Get_Audio_Stream_Gain( stream : A_Allegro_Audio_Stream ) return Float; 
  397.     pragma Import( C, Al_Get_Audio_Stream_Gain, "al_get_audio_stream_gain" ); 
  398.  
  399.     function Al_Set_Audio_Stream_Gain( stream : A_Allegro_Audio_Stream; 
  400.                                        val    : Float ) return Boolean; 
  401.  
  402.     function Al_Get_Audio_Stream_Pan( stream : A_Allegro_Audio_Stream ) return Float; 
  403.     pragma Import( C, Al_Get_Audio_Stream_Pan, "al_get_audio_stream_pan" ); 
  404.  
  405.     function Al_Set_Audio_Stream_Pan( stream : A_Allegro_Audio_Stream; 
  406.                                       val    : Float ) return Boolean; 
  407.  
  408.     function Al_Get_Audio_Stream_Playing( stream : A_Allegro_Audio_Stream ) return Boolean; 
  409.  
  410.     function Al_Set_Audio_Stream_Playing( stream : A_Allegro_Audio_Stream; 
  411.                                           val    : Boolean ) return Boolean; 
  412.  
  413.     procedure Al_Set_Audio_Stream_Playing( stream : A_Allegro_Audio_Stream; 
  414.                                            val    : Boolean ); 
  415.  
  416.     function Al_Get_Audio_Stream_Playmode( stream : A_Allegro_Audio_Stream ) return Allegro_Playmode; 
  417.     pragma Import( C, Al_Get_Audio_Stream_Playmode, "al_get_audio_stream_playmode" ); 
  418.  
  419.     function Al_Set_Audio_Stream_Playmode( stream : A_Allegro_Audio_Stream; 
  420.                                            val    : Allegro_Playmode ) return Boolean; 
  421.  
  422.     procedure Al_Set_Audio_Stream_Playmode( stream : A_Allegro_Audio_Stream; 
  423.                                             val    : Allegro_Playmode ); 
  424.  
  425.     function Al_Get_Audio_Stream_Attached( stream : A_Allegro_Audio_Stream ) return Boolean; 
  426.  
  427.     function Al_Detach_Audio_Stream( stream : A_Allegro_Audio_Stream ) return Boolean; 
  428.  
  429.     procedure Al_Detach_Audio_Stream( stream : A_Allegro_Audio_Stream ); 
  430.  
  431.     function Al_Get_Audio_Stream_Fragment( stream : A_Allegro_Audio_Stream ) return Address; 
  432.     pragma Import( C, Al_Get_Audio_Stream_Fragment, "al_get_audio_stream_fragment" ); 
  433.  
  434.     function Al_Set_Audio_Stream_Fragment( stream : A_Allegro_Audio_Stream; 
  435.                                            val    : Address ) return Boolean; 
  436.  
  437.     function Al_Get_Audio_Stream_Fragments( stream : A_Allegro_Audio_Stream ) return unsigned; 
  438.     pragma Import( C, Al_Get_Audio_Stream_Fragments, "al_get_audio_stream_fragments" ); 
  439.  
  440.     function Al_Get_Available_Audio_Stream_Fragments( stream : A_Allegro_Audio_Stream ) return unsigned; 
  441.     pragma Import( C, Al_Get_Available_Audio_Stream_Fragments, "al_get_available_audio_stream_fragments" ); 
  442.  
  443.     function Al_Seek_Audio_Stream_Secs( stream : A_Allegro_Audio_Stream; 
  444.                                         time   : double ) return Boolean; 
  445.  
  446.     function Al_Get_Audio_Stream_Position_Secs( stream : A_Allegro_Audio_Stream ) return double; 
  447.     pragma Import( C, Al_Get_Audio_Stream_Position_Secs, "al_get_audio_stream_position_secs" ); 
  448.  
  449.     function Al_Get_Audio_Stream_Length_Secs( stream : A_Allegro_Audio_Stream ) return double; 
  450.     pragma Import( C, Al_Get_Audio_Stream_Length_Secs, "al_get_audio_stream_length_secs" ); 
  451.  
  452.     function Al_Set_Audio_Stream_Loop_Secs( stream : A_Allegro_Audio_Stream; 
  453.                                             start  : double; 
  454.                                             finish : double ) return Boolean; 
  455.  
  456.     -- Audio file I/O 
  457.  
  458.     type A_Allegro_Sample_Loader is access 
  459.         function ( filename : C.char_array ) return A_Allegro_Sample; 
  460.     pragma Convention( C, A_Allegro_Sample_Loader ); 
  461.  
  462.     function Al_Register_Sample_Loader( ext    : String; 
  463.                                         loader : A_Allegro_Sample_Loader ) return Boolean; 
  464.  
  465.     type A_Allegro_Sample_Loader_f is access 
  466.         function ( fp : A_Allegro_File ) return A_Allegro_Sample; 
  467.     pragma Convention( C, A_Allegro_Sample_Loader_f ); 
  468.  
  469.     function Al_Register_Sample_Loader_f( ext    : String; 
  470.                                           loader : A_Allegro_Sample_Loader_f ) return Boolean; 
  471.  
  472.     type A_Allegro_Sample_Saver is access 
  473.         function ( filename : C.char_array; spl : A_Allegro_Sample ) return Bool; 
  474.     pragma Convention( C, A_Allegro_Sample_Saver ); 
  475.  
  476.     function Al_Register_Sample_Saver( ext   : String; 
  477.                                        saver : A_Allegro_Sample_Saver ) return Boolean; 
  478.  
  479.     type A_Allegro_Sample_Saver_f is access 
  480.         function ( fp : A_Allegro_File; spl : A_Allegro_Sample ) return Bool; 
  481.     pragma Convention( C, A_Allegro_Sample_Saver_f ); 
  482.  
  483.     function Al_Register_Sample_Saver_f( ext   : String; 
  484.                                          saver : A_Allegro_Sample_Saver_f ) return Boolean; 
  485.  
  486.     type A_Allegro_Audio_Stream_Loader is access 
  487.         function ( filename     : C.char_array; 
  488.                    buffer_count : size_t; 
  489.                    samples      : unsigned ) return A_Allegro_Audio_Stream; 
  490.     pragma Convention( C, A_Allegro_Audio_Stream_Loader ); 
  491.  
  492.     function Al_Register_Audio_Stream_Loader( ext           : String; 
  493.                                               stream_loader : A_Allegro_Audio_Stream_Loader ) return Boolean; 
  494.  
  495.     type A_Allegro_Audio_Stream_Loader_f is access 
  496.         function ( fp           : A_Allegro_File; 
  497.                    buffer_count : size_t; 
  498.                    samples      : unsigned ) return A_Allegro_Audio_Stream; 
  499.     pragma Convention( C, A_Allegro_Audio_Stream_Loader_f ); 
  500.  
  501.     function Al_Register_Audio_Stream_Loader_f( ext           : String; 
  502.                                                 stream_loader : A_Allegro_Audio_Stream_Loader_f ) return Boolean; 
  503.  
  504.     function Al_Load_Sample( filename : String ) return A_Allegro_Sample; 
  505.  
  506.     function Al_Load_Sample_f( fp : A_Allegro_File; ident : String ) return A_Allegro_Sample; 
  507.  
  508.     function Al_Load_Audio_Stream( filename     : String; 
  509.                                    buffer_count : size_t; 
  510.                                    samples      : unsigned ) return A_Allegro_Audio_Stream; 
  511.  
  512.     function Al_Load_Audio_Stream_f( fp           : A_Allegro_File; 
  513.                                      ident        : String; 
  514.                                      buffer_count : size_t; 
  515.                                      samples      : unsigned ) return A_Allegro_Audio_Stream; 
  516.  
  517.     function Al_Save_Sample( filename : String; spl : A_Allegro_Sample ) return Boolean; 
  518.  
  519.     function Al_Save_Sample_f( fp    : A_Allegro_File; 
  520.                                 ident : String; 
  521.                                 spl   : A_Allegro_Sample ) return Boolean; 
  522.  
  523. private 
  524.  
  525.     type Allegro_Mixer is limited null record; 
  526.     pragma Convention( C, Allegro_Mixer ); 
  527.  
  528.     type Allegro_Sample is limited null record; 
  529.     pragma Convention( C, Allegro_Sample ); 
  530.  
  531.     type Allegro_Sample_Instance is limited null record; 
  532.     pragma Convention( C, Allegro_Sample_Instance ); 
  533.  
  534.     type Allegro_Audio_Stream is limited null record; 
  535.     pragma Convention( C, Allegro_Audio_Stream ); 
  536.  
  537.     type Allegro_Voice is limited null record; 
  538.     pragma Convention( C, Allegro_Voice ); 
  539.  
  540. end Allegro.Audio;