Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 76 additions & 15 deletions libopera/opera_cdrom.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ typedef struct cdrom_ode_runtime_state_s
char playlist[ODE_PLAYLIST_MAX][PATH_MAX_LENGTH];
uint32_t playlist_count;
char pending_launch_path[PATH_MAX_LENGTH];
uint32_t pending_launch_flags;
uint8_t toc[REQSIZE];
uint8_t file_buffer[REQSIZE];
uint8_t file_buffer_write_data[REQSIZE];
Expand Down Expand Up @@ -1235,6 +1236,7 @@ ode_reset_session(void)
ode_str_copy(g_CDROM_STATE.ode.current,g_CDROM_STATE.ode.root,sizeof(g_CDROM_STATE.ode.current));
ode_playlist_clear();
g_CDROM_STATE.ode.pending_launch_path[0] = 0;
g_CDROM_STATE.ode.pending_launch_flags = 0;
memset(g_CDROM_STATE.ode.toc,0xFF,sizeof(g_CDROM_STATE.ode.toc));
memset(g_CDROM_STATE.ode.file_buffer,0,sizeof(g_CDROM_STATE.ode.file_buffer));
ode_file_buffer_write_reset();
Expand Down Expand Up @@ -1292,26 +1294,47 @@ ode_complete_restart_if_armed(cdrom_device_t *cd_)

}

int
opera_cdrom_ode_request_launch(const char *path_,
uint32_t flags_)
{
if(g_CDROM_STATE.ode.launch == NULL)
return false;

ode_str_copy(g_CDROM_STATE.ode.pending_launch_path,
path_,
sizeof(g_CDROM_STATE.ode.pending_launch_path));
g_CDROM_STATE.ode.pending_launch_flags = flags_;
g_CDROM_STATE.ode.restart_requested = true;

return true;
}

int
opera_cdrom_ode_consume_restart_request(void)
{
const char *path;
bool requested;
uint32_t flags;

requested = g_CDROM_STATE.ode.restart_requested;
g_CDROM_STATE.ode.restart_requested = false;
if(!requested)
return false;

requested = false;
if((g_CDROM_STATE.ode.pending_launch_path[0] != 0) &&
(g_CDROM_STATE.ode.launch != NULL) &&
(g_CDROM_STATE.ode.launch(g_CDROM_STATE.ode.pending_launch_path) == 0))
flags = g_CDROM_STATE.ode.pending_launch_flags;
path = (g_CDROM_STATE.ode.pending_launch_path[0] != 0) ?
g_CDROM_STATE.ode.pending_launch_path : NULL;
if((g_CDROM_STATE.ode.launch != NULL) &&
(g_CDROM_STATE.ode.launch(path,flags) == 0))
{
g_CDROM_STATE.ode.media_access_after_reset = true;
requested = true;
}

g_CDROM_STATE.ode.pending_launch_path[0] = 0;
g_CDROM_STATE.ode.pending_launch_flags = 0;

return requested;
}
Expand Down Expand Up @@ -2618,17 +2641,22 @@ void
opera_cdrom_init(cdrom_device_t *cd_)
{
char pending_launch_path[PATH_MAX_LENGTH];
uint32_t pending_launch_flags;
bool preserve_pending_launch;
bool media_access_after_reset;

pending_launch_path[0] = 0;
pending_launch_flags = 0;
preserve_pending_launch = ((g_CDROM_STATE.ode.restart_armed || g_CDROM_STATE.ode.restart_requested) &&
(g_CDROM_STATE.ode.pending_launch_path[0] != 0));
media_access_after_reset = g_CDROM_STATE.ode.media_access_after_reset;
if(preserve_pending_launch)
ode_str_copy(pending_launch_path,
g_CDROM_STATE.ode.pending_launch_path,
sizeof(pending_launch_path));
{
ode_str_copy(pending_launch_path,
g_CDROM_STATE.ode.pending_launch_path,
sizeof(pending_launch_path));
pending_launch_flags = g_CDROM_STATE.ode.pending_launch_flags;
}

if(!cdrom_persona_is_portfolio_native_mei())
opera_log_printf(OPERA_LOG_WARN,
Expand All @@ -2641,10 +2669,11 @@ opera_cdrom_init(cdrom_device_t *cd_)

cd_->xbus_status = 0;
cd_->poll = CDROM_POLL_INTEN_MASK;
cd_->xbus_status |= (CDROM_STATUS_READY |
CDROM_STATUS_DOOR |
CDROM_STATUS_DISC_IN |
CDROM_STATUS_SPIN_UP);
cd_->xbus_status |= CDROM_STATUS_READY;
if(cd_->callbacks.get_size() > 0)
cd_->xbus_status |= (CDROM_STATUS_DOOR |
CDROM_STATUS_DISC_IN |
CDROM_STATUS_SPIN_UP);

cdrom_mode_reset(cd_);
cd_->MEI_status = MEI_CDROM_no_error;
Expand All @@ -2656,6 +2685,7 @@ opera_cdrom_init(cdrom_device_t *cd_)
ode_str_copy(g_CDROM_STATE.ode.pending_launch_path,
pending_launch_path,
sizeof(g_CDROM_STATE.ode.pending_launch_path));
g_CDROM_STATE.ode.pending_launch_flags = pending_launch_flags;
g_CDROM_STATE.ode.restart_requested = true;
}
if(media_access_after_reset)
Expand Down Expand Up @@ -2982,6 +3012,8 @@ ode_launch_playlist(cdrom_device_t *cd_)
ode_str_copy(g_CDROM_STATE.ode.pending_launch_path,
g_CDROM_STATE.ode.playlist[0],
sizeof(g_CDROM_STATE.ode.pending_launch_path));
g_CDROM_STATE.ode.pending_launch_flags =
OPERA_CDROM_ODE_LAUNCH_UPDATE_CONTENT_PATH;
g_CDROM_STATE.ode.restart_armed = true;
}

Expand Down Expand Up @@ -3260,7 +3292,8 @@ cdrom_cmd_diagnostics(cdrom_device_t *cd_)

static
void
cdrom_cmd_eject_disc(cdrom_device_t *cd_)
cdrom_media_eject(cdrom_device_t *cd_,
bool command_status_)
{
cdrom_data_clear_transfer(cd_);
cd_->xbus_status |= CDROM_STATUS_READY;
Expand All @@ -3271,14 +3304,24 @@ cdrom_cmd_eject_disc(cdrom_device_t *cd_)
cd_->xbus_status &= ~CDROM_STATUS_ERROR;
cd_->MEI_status = MEI_CDROM_no_error;

cd_->status_len = 2;
cd_->status[0] = CDROM_CMD_EJECT_DISC;
cd_->status[1] = cd_->xbus_status;
if(command_status_)
{
cd_->status_len = 2;
cd_->status[0] = CDROM_CMD_EJECT_DISC;
cd_->status[1] = cd_->xbus_status;

cd_->poll |= POLST;
cd_->poll |= POLST;
}
cdrom_media_access_latch(cd_);
}

static
void
cdrom_cmd_eject_disc(cdrom_device_t *cd_)
{
cdrom_media_eject(cd_,true);
}

static
void
cdrom_cmd_inject_disc(cdrom_device_t *cd_)
Expand All @@ -3301,6 +3344,24 @@ cdrom_cmd_inject_disc(cdrom_device_t *cd_)
cdrom_media_access_latch(cd_);
}

int
opera_cdrom_media_ejected(const cdrom_device_t *cd_)
{
if(cd_ == NULL)
return true;

return !(cd_->xbus_status & CDROM_STATUS_DOOR);
}

void
opera_cdrom_media_eject(cdrom_device_t *cd_)
{
if(cd_ == NULL)
return;

cdrom_media_eject(cd_,false);
}

static
void
cdrom_cmd_abort(cdrom_device_t *cd_)
Expand Down
8 changes: 7 additions & 1 deletion libopera/opera_cdrom.h
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,10 @@ typedef void (*opera_cdrom_get_toc_cb_t)(uint8_t *track_first_,
uint8_t *disc_id_,
void *disc_toc_,
uint32_t disc_toc_size_);
typedef int (*opera_cdrom_ode_launch_cb_t)(const char *path_);
#define OPERA_CDROM_ODE_LAUNCH_UPDATE_CONTENT_PATH 0x00000001

typedef int (*opera_cdrom_ode_launch_cb_t)(const char *path_,
uint32_t flags_);

typedef struct cdrom_callbacks_s cdrom_callbacks_t;
struct cdrom_callbacks_s
Expand Down Expand Up @@ -314,8 +317,11 @@ void opera_cdrom_set_callbacks(opera_cdrom_get_size_cb_t get_size_,
opera_cdrom_set_sector_cb_t set_sector_,
opera_cdrom_read_sector_cb_t read_sector_,
opera_cdrom_get_toc_cb_t get_toc_);
int opera_cdrom_media_ejected(const cdrom_device_t *cd_);
void opera_cdrom_media_eject(cdrom_device_t *cd_);
void opera_cdrom_ode_set_root(const char *root_);
void opera_cdrom_ode_set_launch_callback(opera_cdrom_ode_launch_cb_t launch_);
int opera_cdrom_ode_request_launch(const char *path_, uint32_t flags_);
int opera_cdrom_ode_consume_restart_request(void);
int opera_cdrom_ode_restart_requested(void);
void opera_cdrom_ode_reset_session(void);
Expand Down
12 changes: 12 additions & 0 deletions libopera/opera_xbus_cdrom_plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,18 @@

static cdrom_device_t g_CDROM_DEVICE = {0};

int
xbus_cdrom_media_ejected(void)
{
return opera_cdrom_media_ejected(&g_CDROM_DEVICE);
}

void
xbus_cdrom_media_eject(void)
{
opera_cdrom_media_eject(&g_CDROM_DEVICE);
}

void*
xbus_cdrom_plugin(int proc_,
void* data_)
Expand Down
2 changes: 2 additions & 0 deletions libopera/opera_xbus_cdrom_plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,7 @@
#define LIBOPERA_XBUS_CDROM_PLUGIN_H_INCLUDED

void* xbus_cdrom_plugin(int proc_, void* data_);
int xbus_cdrom_media_ejected(void);
void xbus_cdrom_media_eject(void);

#endif /* LIBOPERA_XBUS_CDROM_PLUGIN_H_INCLUDED */
Loading