Skip to content

Commit

Permalink
Fix a few CDROM audio playback on older mac issues
Browse files Browse the repository at this point in the history
- Playback time displays correctly
- Reported DATA IN length from GetConfiguration length corrected
- Initial status of CD=ROM corrected

Still not implemented:
- Next/Prev track while playing
- Fast forward/rewind
  • Loading branch information
morio committed Mar 1, 2024
1 parent d26c474 commit 22a31f3
Show file tree
Hide file tree
Showing 9 changed files with 75 additions and 37 deletions.
15 changes: 12 additions & 3 deletions lib/SCSI2SD/src/firmware/mode.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,9 +288,18 @@ static void doModeSense(
break;

case S2S_CFG_OPTICAL:
mediumType = 0x02; // 120mm CDROM, data only.
deviceSpecificParam = 0;
density = 0x01; // User data only, 2048bytes per sector.
if (scsiDev.target->cfg->quirks == S2S_CFG_QUIRKS_APPLE)
{
mediumType = 0x00;
deviceSpecificParam = 0;
density = 0x00;
}
else
{
mediumType = 0x02; // 120mm CDROM, data only.
deviceSpecificParam = 0;
density = 0x01; // User data only, 2048bytes per sector.
}
break;

case S2S_CFG_SEQUENTIAL:
Expand Down
12 changes: 11 additions & 1 deletion lib/ZuluSCSI_platform_GD32F205/audio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ extern bool g_audio_stopped;


// historical playback status information
static audio_status_code audio_last_status[8] = {ASC_NO_STATUS};
static audio_status_code audio_last_status[8] = {ASC_NO_STATUS, ASC_NO_STATUS, ASC_NO_STATUS, ASC_NO_STATUS,
ASC_NO_STATUS, ASC_NO_STATUS, ASC_NO_STATUS, ASC_NO_STATUS};

// volume information for targets
static volatile uint16_t volumes[8] = {
Expand Down Expand Up @@ -410,5 +411,14 @@ void audio_set_channel(uint8_t id, uint16_t chn) {
channels[id & 7] = chn;
}

uint64_t audio_get_file_position()
{
return fpos;
}

void audio_set_file_position(uint32_t lba)
{
fpos = 2352 * (uint64_t)lba;
}

#endif // ENABLE_AUDIO_OUTPUT
15 changes: 13 additions & 2 deletions lib/ZuluSCSI_platform_RP2040/audio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,9 @@ static uint64_t fpos;
static uint32_t fleft;

// historical playback status information
static audio_status_code audio_last_status[8] = {ASC_NO_STATUS};

static audio_status_code audio_last_status[8] = {ASC_NO_STATUS, ASC_NO_STATUS, ASC_NO_STATUS, ASC_NO_STATUS,
ASC_NO_STATUS, ASC_NO_STATUS, ASC_NO_STATUS, ASC_NO_STATUS};
.
// volume information for targets
static volatile uint16_t volumes[8] = {
DEFAULT_VOLUME_LEVEL_2CH, DEFAULT_VOLUME_LEVEL_2CH, DEFAULT_VOLUME_LEVEL_2CH, DEFAULT_VOLUME_LEVEL_2CH,
Expand Down Expand Up @@ -585,4 +586,14 @@ void audio_set_channel(uint8_t id, uint16_t chn) {
channels[id & 7] = chn;
}

uint64_t audio_get_file_position()
{
return fpos;
}

void audio_set_file_position(uint32_t lba)
{
fpos = 2352 * (uint64_t)lba;

}
#endif // ENABLE_AUDIO_OUTPUT
2 changes: 1 addition & 1 deletion platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ lib_deps =
upload_protocol = stlink
platform_packages = platformio/[email protected]
framework-spl-gd32@https://github.com/CommunityGD32Cores/gd32-pio-spl-package.git
debug_tool = cmsis-dap
debug_tool = stlink
extra_scripts = src/build_bootloader.py
debug_build_flags =
-Os -Wall -Wno-sign-compare -ggdb -g3
Expand Down
15 changes: 14 additions & 1 deletion src/ZuluSCSI_audio.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,17 @@ uint16_t audio_get_channel(uint8_t id);
* \param id SCSI ID to set channel information for.
* \param chn The new channel information.
*/
void audio_set_channel(uint8_t id, uint16_t chn);
void audio_set_channel(uint8_t id, uint16_t chn);

/**
* Gets the byte position in the audio image
*
* \return byte position in the audio image
*/
uint64_t audio_get_file_position();

/**
* Sets the playback position in the audio image via the lba
*
*/
void audio_set_file_position(uint32_t lba);
21 changes: 8 additions & 13 deletions src/ZuluSCSI_cdrom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1089,7 +1089,7 @@ void doGetConfiguration(uint8_t rt, uint16_t startFeature, uint16_t allocationLe
#endif

// finally, rewrite data length to match
uint32_t dlen = len - 8;
uint32_t dlen = len - 4;
scsiDev.data[0] = dlen >> 24;
scsiDev.data[1] = dlen >> 16;
scsiDev.data[2] = dlen >> 8;
Expand Down Expand Up @@ -1301,14 +1301,7 @@ void cdromGetAudioPlaybackStatus(uint8_t *status, uint32_t *current_lba, bool cu
#else
if (status) *status = 0; // audio status code for 'unsupported/invalid' and not-playing indicator
#endif
if (current_lba)
{
if (img.file.isOpen()) {
*current_lba = img.file.position() / 2352;
} else {
*current_lba = 0;
}
}
*current_lba = audio_get_file_position() / 2352;
}

static void doPlayAudio(uint32_t lba, uint32_t length)
Expand All @@ -1325,8 +1318,10 @@ static void doPlayAudio(uint32_t lba, uint32_t length)

// if transfer length is zero no audio playback happens.
// don't treat as an error per SCSI-2; handle via short-circuit

if (length == 0)
{
audio_set_file_position(lba);
scsiDev.status = 0;
scsiDev.phase = STATUS;
return;
Expand All @@ -1342,7 +1337,7 @@ static void doPlayAudio(uint32_t lba, uint32_t length)
if (lba == 0xFFFFFFFF)
{
// request to start playback from 'current position'
lba = img.file.position() / 2352;
lba = audio_get_file_position() / 2352;
}

uint64_t offset = trackinfo.file_offset
Expand Down Expand Up @@ -1400,7 +1395,7 @@ static void doPlayAudio(uint32_t lba, uint32_t length)
static void doPauseResumeAudio(bool resume)
{
#ifdef ENABLE_AUDIO_OUTPUT
logmsg("------ CD-ROM ", resume ? "resume" : "pause", " audio playback");
dbgmsg("------ CD-ROM ", resume ? "resume" : "pause", " audio playback");
image_config_t &img = *(image_config_t*)scsiDev.target->cfg;
uint8_t target_id = img.scsiId & 7;

Expand Down Expand Up @@ -1707,7 +1702,7 @@ static void doReadSubchannel(bool time, bool subq, uint8_t parameter, uint8_t tr
if (parameter == 0x01)
{
uint8_t audiostatus;
uint32_t lba;
uint32_t lba = 0;
cdromGetAudioPlaybackStatus(&audiostatus, &lba, false);
dbgmsg("------ Get audio playback position: status ", (int)audiostatus, " lba ", (int)lba);

Expand Down Expand Up @@ -2035,7 +2030,7 @@ extern "C" int scsiCDRomCommand()
{
// request to start playback from 'current position'
image_config_t &img = *(image_config_t*)scsiDev.target->cfg;
lba = img.file.position() / 2352;
lba = audio_get_file_position() / 2352;
}

uint32_t length = end - lba;
Expand Down
2 changes: 1 addition & 1 deletion src/ZuluSCSI_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@
// Default SCSI drive information when Apple quirks are enabled
#define APPLE_DRIVEINFO_FIXED {"CDC", "ZuluSCSI HDD", PLATFORM_REVISION, "1.0"}
#define APPLE_DRIVEINFO_REMOVABLE {"IOMEGA", "BETA230", PLATFORM_REVISION, "2.02"}
#define APPLE_DRIVEINFO_OPTICAL {"MATSHITA", "CD-ROM CR-8004A", PLATFORM_REVISION, "2.0a"}
#define APPLE_DRIVEINFO_OPTICAL {"MATSHITA", "CD-ROM CR-8004", PLATFORM_REVISION, "1.1f"}
#define APPLE_DRIVEINFO_FLOPPY {"IOMEGA", "Io20S *F", "PP33", ""}
#define APPLE_DRIVEINFO_MAGOPT {"MOST", "RMD-5200", PLATFORM_REVISION, "1.0"}
#define APPLE_DRIVEINFO_NETWORK {"Dayna", "SCSI/Link", "2.0f", ""}
Expand Down
26 changes: 13 additions & 13 deletions src/ZuluSCSI_log_trace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,9 +177,9 @@ static void printNewPhase(int phase, bool initiator = false)
if (!initiator && scsiDev.target->syncOffset > 0)
dbgmsg("---- DATA_OUT, syncOffset ", (int)scsiDev.target->syncOffset,
" syncPeriod ", (int)scsiDev.target->syncPeriod);
// log Xebec vendor commands data
else if (scsiDev.cdb[0] == 0x0C || scsiDev.cdb[0] == 0x0F)
g_LogData = true;
// log Xebec vendor commands data
else if (scsiDev.cdb[0] == 0x0C || scsiDev.cdb[0] == 0x0F)
g_LogData = true;
else
dbgmsg("---- DATA_OUT");
break;
Expand Down Expand Up @@ -212,17 +212,17 @@ void scsiLogPhaseChange(int new_phase)
{
dbgmsg("---- Total IN: ", g_InByteCount, " OUT: ", g_OutByteCount, " CHECKSUM: ", (int)g_DataChecksum);
}
// log Xebec vendor command
// log Xebec vendor command
if (old_phase == DATA_OUT && scsiDev.cdb[0] == 0x0C && g_OutByteCount == 8)
{
int cylinders = ((uint16_t)scsiDev.data[0] << 8) + scsiDev.data[1];
int heads = scsiDev.data[2];
int reducedWrite = ((uint16_t)scsiDev.data[3] << 8) + scsiDev.data[4];
int writePrecomp = ((uint16_t)scsiDev.data[5] << 8) + scsiDev.data[6];
int eccBurst = scsiDev.data[7];
dbgmsg("---- Xebec Initialize Drive Characteristics: cylinders=", cylinders, " heads=", heads,
" reducedWrite=", reducedWrite, " writePrecomp=", writePrecomp, " eccBurst=", eccBurst);
}
{
int cylinders = ((uint16_t)scsiDev.data[0] << 8) + scsiDev.data[1];
int heads = scsiDev.data[2];
int reducedWrite = ((uint16_t)scsiDev.data[3] << 8) + scsiDev.data[4];
int writePrecomp = ((uint16_t)scsiDev.data[5] << 8) + scsiDev.data[6];
int eccBurst = scsiDev.data[7];
dbgmsg("---- Xebec Initialize Drive Characteristics: cylinders=", cylinders, " heads=", heads,
" reducedWrite=", reducedWrite, " writePrecomp=", writePrecomp, " eccBurst=", eccBurst);
}
g_InByteCount = g_OutByteCount = 0;
g_DataChecksum = 0;

Expand Down
4 changes: 2 additions & 2 deletions src/ZuluSCSI_mode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ static const uint8_t CDROMAudioControlParametersPage[] =
0x04, // 'Immed' bit set, 'SOTC' bit not set
0x00, // reserved
0x00, // reserved
0x80, // 1 LBAs/sec multip
0x00, 0x4B, // 75 LBAs/sec
0x00, // reserved was // 0x80, // 1 LBAs/sec multip
0x00, 0x00, // obsolete was // 75 LBAs/sec
0x01, 0xFF, // output port 0 active, max volume
0x02, 0xFF, // output port 1 active, max volume
0x00, 0x00, // output port 2 inactive
Expand Down

0 comments on commit 22a31f3

Please sign in to comment.