Audio-SID
view release on metacpan or search on metacpan
$self->{validateWrite} = 0;
if (defined($_[0])) {
# Read errors are taken care of by read().
return ($self->read(%params) ? $self : undef);
}
return $self;
}
sub initialize() {
my ($self) = $_[0];
# Initial SID data.
$self->{SIDdata} = {
magicID => 'RSID',
version => 4,
dataOffset => 0x7C,
loadAddress => 0,
initAddress => 0,
playAddress => 0,
if ($self->{SIDdata}{data} and $self->{SIDdata}{loadAddress} == 0) {
$REAL_LOAD_ADDRESS = unpack("v", substr($self->{SIDdata}{data}, 0, 2));
}
else {
$REAL_LOAD_ADDRESS = $self->{SIDdata}{loadAddress};
}
return $REAL_LOAD_ADDRESS;
}
sub getSpeed($) {
my ($self, $songnumber) = @_;
$songnumber = 1 if ((!defined($songnumber)) or ($songnumber < 1));
if ($songnumber > $self->{SIDdata}{songs}) {
confess ("Song number '$songnumber' is invalid!");
return undef;
}
if ($self->isPlaySIDSpecific()) {
elsif ($SIDModel == 2) {
$SIDModel = '8580';
}
elsif ($SIDModel == 3) {
$SIDModel = 'EITHER';
}
return $SIDModel;
}
sub getSIDAddress($) {
my ($self, $sidNumber) = @_;
my $SIDAddressMiddle;
my $fullSIDAddress;
if (!defined($sidNumber) or ($sidNumber == 1)) {
# Original SID is always at $D400. This is implied, it's not contained
# in SID file data at all - it's returned just for completeness.
$SIDAddressMiddle = 0x40;
}
elsif ($sidNumber == 2) {
$SIDAddressMiddle = $self->{SIDdata}{thirdSIDAddress};
}
$fullSIDAddress = 0xD000 + $SIDAddressMiddle * 0x10;
return $fullSIDAddress;
}
# Notice that you have to pass in a hash (field-value pairs)!
sub set(@) {
my ($self, %SIDhash) = @_;
my $fieldname;
my $paddinglength;
my $i;
my $version;
my $offset;
my $changePSIDSpecific = 0;
foreach $fieldname (keys %SIDhash) {
}
}
}
$self->{FILESIZE} = $self->{SIDdata}{dataOffset} + length($self->{PADDING}) +
length($self->{SIDdata}{data});
return 1;
}
sub setFileName($) {
my ($self, $filename) = @_;
$self->{FILENAME} = $filename;
}
sub setSpeed($$) {
my ($self, $songnumber, $value) = @_;
unless (defined($songnumber)) {
confess ("No song number was specified!");
return undef;
}
unless (defined($value)) {
confess ("No speed value was specified!");
return undef;
$songnumber = 32 if ($songnumber > 32);
}
# First, clear the bit in question.
$self->{SIDdata}{speed} &= ~(0x1 << ($songnumber-1));
# Then set it.
$self->{SIDdata}{speed} |= ($value << ($songnumber-1));
}
sub setMUSPlayer($) {
my ($self, $MUSplayer) = @_;
unless (defined($self->{SIDdata}{flags})) {
confess ("Cannot set this field when SID version is 1!");
return undef;
}
if (($MUSplayer ne 0) and ($MUSplayer ne 1)) {
confess ("Specified value '$MUSplayer' is invalid!");
return undef;
}
# First, clear the bit in question.
$self->{SIDdata}{flags} &= ~(0x1 << $MUSPLAYER_OFFSET);
# Then set it.
$self->{SIDdata}{flags} |= ($MUSplayer << $MUSPLAYER_OFFSET);
}
sub setPlaySID($) {
my ($self, $PlaySID) = @_;
if ($self->isRSID() ) {
confess ("Cannot set this field for RSID!");
return undef;
}
unless (defined($self->{SIDdata}{flags})) {
confess ("Cannot set this field when SID version is 1!");
return undef;
return undef;
}
# First, clear the bit in question.
$self->{SIDdata}{flags} &= ~(0x1 << $PLAYSID_OFFSET);
# Then set it.
$self->{SIDdata}{flags} |= ($PlaySID << $PLAYSID_OFFSET);
}
sub setC64BASIC($) {
my ($self, $C64BASIC) = @_;
unless ($self->isRSID() ) {
confess ("Cannot set this field for PSID!");
return undef;
}
unless (defined($self->{SIDdata}{flags})) {
confess ("Cannot set this field when SID version is 1!");
return undef;
$self->{SIDdata}{flags} &= ~(0x1 << $C64BASIC_OFFSET);
# Then set it.
$self->{SIDdata}{flags} |= ($C64BASIC << $C64BASIC_OFFSET);
if ($C64BASIC) {
$self->{SIDdata}{initAddress} = 0;
}
}
sub setClock($) {
my ($self, $clock) = @_;
unless (defined($self->{SIDdata}{flags})) {
confess ("Cannot set this field when SID version is 1!");
return undef;
}
if (($clock < 0) or ($clock > 3)) {
confess ("Specified value '$clock' is invalid!");
return undef;
}
# First, clear the bits in question.
$self->{SIDdata}{flags} &= ~(0x3 << $CLOCK_OFFSET);
# Then set them.
$self->{SIDdata}{flags} |= ($clock << $CLOCK_OFFSET);
}
sub setClockByName($) {
my ($self, $clock) = @_;
unless (defined($self->{SIDdata}{flags})) {
confess ("Cannot set this field when SID version is 1!");
return undef;
}
if ($clock =~ /^(unknown|none|neither)$/i) {
$clock = 0;
}
$clock = 3;
}
else {
confess ("Specified value '$clock' is invalid!");
return undef;
}
$self->setClock($clock);
}
sub setSIDModel($) {
my ($self, $SIDModel, $sidNumber) = @_;
unless (defined($self->{SIDdata}{flags})) {
confess ("Cannot set this field when SID version is 1!");
return undef;
}
if (($SIDModel < 0) or ($SIDModel > 3)) {
confess ("Specified value '$SIDModel' is invalid!");
return undef;
return undef unless ($self->{SIDdata}{version} >= 4);
# First, clear the bits in question.
$self->{SIDdata}{flags} &= ~(0x3 << $THIRD_SIDMODEL_OFFSET);
# Then set them.
$self->{SIDdata}{flags} |= ($SIDModel << $THIRD_SIDMODEL_OFFSET);
}
}
sub setSIDModelByName($) {
my ($self, $SIDModel, $sidNumber) = @_;
unless (defined($self->{SIDdata}{flags})) {
confess ("Cannot set this field when SID version is 1!");
return undef;
}
if ($SIDModel =~ /^(unknown|none|neither)$/i) {
$SIDModel = 0;
}
$SIDModel = 3;
}
else {
confess ("Specified value '$SIDModel' is invalid!");
return undef;
}
return $self->setSIDModel($SIDModel, $sidNumber);
}
sub setSIDAddress($) {
my ($self, $sidNumber, $fullSIDAddress) = @_;
if (!defined($sidNumber) or ($sidNumber < 2) or ($sidNumber > 3)) {
confess("Invalid SID number: '$sidNumber'!");
return undef;
}
if (!defined($fullSIDAddress)) {
confess("SID address was not specified!");
return undef;
my $clock = $self->getClock();
if (($self->{SIDdata}{version} > 1) and ($clock == 2) and !$oldMD5) {
$md5->add(pack("C",$clock));
}
return ($md5->hexdigest);
}
sub alwaysValidateWrite($) {
my ($self, $setting) = @_;
$self->{validateWrite} = $setting;
}
sub validate {
my $self = shift;
my $field;
my $MUSPlayer;
my $PlaySID;
( run in 0.714 second using v1.01-cache-2.11-cpan-65fba6d93b7 )