The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
BEGIN { # http://wiki.cpantesters.org/wiki/CPANAuthorNotes
	use Config;
	if ( !$Config{'useithreads'} ) {
		print("1..0 # Skip: Perl not compiled with 'useithreads'\n");
		exit(0);
	}
}
use strict;
use warnings;
use SDL;
use SDL::Audio;
use SDL::AudioSpec;
use Test::More;
use Devel::Peek;

use lib 't/lib';
use SDL::TestTool;

my $audiodriver = $ENV{SDL_AUDIODRIVER};
$ENV{SDL_AUDIODRIVER} = 'dummy' unless $ENV{SDL_RELEASE_TESTING};

if ( !SDL::TestTool->init(SDL_INIT_AUDIO) ) {
	plan( skip_all => 'Failed to init sound' );
} else {
	plan( tests => 45 );
}
my @done = qw/
	audio_spec
	open
	pause
	close
	get_status
	lock
	unlock
	/;

is( AUDIO_S16,      32784,  'AUDIO_S16 should be imported' );
is( AUDIO_S16(),    32784,  'AUDIO_S16() should also be available' );
is( AUDIO_S16MSB,   36880,  'AUDIO_S16MSB should be imported' );
is( AUDIO_S16MSB(), 36880,  'AUDIO_S16MSB() should also be available' );
is( AUDIO_S16LSB,   0x8010, 'AUDIO_S16MSB should be imported' );
is( AUDIO_S16LSB(), 0x8010, 'AUDIO_S16MSB() should also be available' );
is( AUDIO_S8,       32776,  'AUDIO_S8 should be imported' );
is( AUDIO_S8(),     32776,  'AUDIO_S8() should also be available' );
is( AUDIO_U16,      16,     'AUDIO_U16 should be imported' );
is( AUDIO_U16(),    16,     'AUDIO_U16() should also be available' );
is( AUDIO_U16MSB,   4112,   'AUDIO_U16MSB should be imported' );
is( AUDIO_U16MSB(), 4112,   'AUDIO_U16MSB() should also be available' );
is( AUDIO_U16LSB,   0x0010, 'AUDIO_U16MSB should be imported' );
is( AUDIO_U16LSB(), 0x0010, 'AUDIO_U16MSB() should also be available' );
is( AUDIO_U8,       8,      'AUDIO_U8 should be imported' );
is( AUDIO_U8(),     8,      'AUDIO_U8() should also be available' );
ok( ( SDL::Audio::AUDIO_U16SYS == AUDIO_U16LSB ) || ( SDL::Audio::AUDIO_U16SYS == AUDIO_U16MSB ),
	'AUDIO_U16SYS should be imported'
);
ok( ( SDL::Audio::AUDIO_U16SYS() == AUDIO_U16LSB() ) || ( SDL::Audio::AUDIO_U16SYS() == AUDIO_U16MSB() ),
	'AUDIO_U16SYS() should also be available'
);

is( SDL_AUDIO_PAUSED,    2, 'SDL_AUDIO_PAUSED should be imported' );
is( SDL_AUDIO_PAUSED(),  2, 'SDL_AUDIO_PAUSED() should also be available' );
is( SDL_AUDIO_PLAYING,   1, 'SDL_AUDIO_PLAYING should be imported' );
is( SDL_AUDIO_PLAYING(), 1, 'SDL_AUDIO_PLAYING() should also be available' );
is( SDL_AUDIO_STOPPED,   0, 'SDL_AUDIO_STOPPED should be imported' );
is( SDL_AUDIO_STOPPED(), 0, 'SDL_AUDIO_STOPPED() should also be available' );

my $driver = SDL::Audio::audio_driver_name();
pass "[audio_driver_name] using audio driver $driver";

my $desired = SDL::AudioSpec->new;
$desired->freq(44100);
is( $desired->freq, 44100, '[audiospec] can set freq' );
$desired->format(SDL::Audio::AUDIO_S16SYS);
is( $desired->format, SDL::Audio::AUDIO_S16SYS, '[audiospec] can set format' );
$desired->channels(2);
is( $desired->channels, 2, '[audiospec] can set channels' );
$desired->samples(4096);
is( $desired->samples, 4096, '[audiospec] can set samples' );
$desired->callback('main::audio_callback');

is( SDL::Audio::get_status, SDL_AUDIO_STOPPED, '[get_status stopped]' );

my $obtained = SDL::AudioSpec->new;
is( SDL::Audio::open( $desired, $obtained ), 0, '[open returned success]' );
isa_ok( $obtained, 'SDL::AudioSpec', 'Created a new AudioSpec' );

my $wav_ref = SDL::Audio::load_wav( 'test/data/sample.wav', $obtained );
isa_ok( $wav_ref, 'ARRAY', "Got and Array Out of load_wav. $wav_ref" );
my ( $wav_spec, $audio_buf, $audio_len ) = @{$wav_ref};
isa_ok( $wav_spec, 'SDL::AudioSpec', '[load_wav] got Audio::Spec back out ' );
is( $audio_len, 481712, '[load_wav] length is correct' );
SDL::Audio::free_wav($audio_buf);

is( SDL::Audio::get_status, SDL_AUDIO_PAUSED, '[get_status paused]' );

SDL::Audio::pause(0);

is( SDL::Audio::get_status, SDL_AUDIO_PLAYING, '[get_status playing]' );

SDL::Audio::lock();
pass('Audio locked');
SDL::Audio::unlock();
pass('Audio unlocked');
SDL::Audio::close();
pass('Audio Closed');
is( SDL::Audio::get_status, SDL_AUDIO_STOPPED, '[get_status stopped]' );

my @left = qw/
	audio_cvt
	build_audio_cvt
	convert_audio
	mix_audio
	/;

my $why =
	  '[Percentage Completion] '
	. int( 100 * ( $#done + 1 ) / ( $#done + $#left + 2 ) )
	. "\% implementation. "
	. ( $#done + 1 ) . " / "
	. ( $#done + $#left + 2 );

TODO:
{
	local $TODO = $why;
	fail "Not Implmented $_" foreach (@left)

}
print "$why\n";

if ($audiodriver) {
	$ENV{SDL_AUDIODRIVER} = $audiodriver;
} else {
	delete $ENV{SDL_AUDIODRIVER};
}

sleep(1);

sub audio_callback {

}