author | R. Bernstein <rocky@users.noreply.github.com> | 2025年01月03日 18:46:33 -0500 |
---|---|---|
committer | Robert Kausch <robert.kausch@freac.org> | 2025年01月04日 16:30:07 +0100 |
commit | b5d1bf244900f84d2da0fc9053c729ddc8ee47a9 (patch) | |
tree | 9ba11c969e472a6ec5a64f6e8c526dd084c70a00 | |
parent | 42226fa48a670475a1c3cbbd33319f43fb678800 (diff) | |
download | libcdio-b5d1bf244900f84d2da0fc9053c729ddc8ee47a9.tar.gz |
-rw-r--r-- | lib/driver/osx.c | 69 |
diff --git a/lib/driver/osx.c b/lib/driver/osx.c index a945dd99..f85eeebc 100644 --- a/lib/driver/osx.c +++ b/lib/driver/osx.c @@ -58,6 +58,7 @@ typedef enum { #include "cdio_assert.h" #include "cdio_private.h" +#include "cdtext_private.h" #include <string.h> @@ -1598,6 +1599,70 @@ _get_arg_osx (void *user_data, const char key[]) } /** + Read CD-Text binary data. +*/ +static uint8_t * +read_cdtext_osx(void *p_user_data) +{ + _img_private_t *p_env = p_user_data; + dk_cd_read_toc_t cd_read; + size_t size = CDTEXT_LEN_BINARY_MAX + 4; + uint8_t *data = malloc(size); + + memset( &cd_read, 0, sizeof(cd_read) ); + memset( data, 0, size ); + + cd_read.format = kCDTOCFormatTEXT; + cd_read.formatAsTime = 0; + + cd_read.bufferLength = size; + cd_read.buffer = data; + + if ( ioctl( p_env->gen.fd, DKIOCCDREADTOC, &cd_read ) < 0 ) + { + cdio_debug( "could not read CD-Text, %s", strerror(errno) ); + free( data ); + return NULL; + } + + return data; +} + +/** + Read CD-Text and return cdtext_t structure. +*/ +static cdtext_t * +get_cdtext_osx (void *p_user_data) +{ + generic_img_private_t *p_env = p_user_data; + uint8_t *p_cdtext_data = NULL; + size_t len; + + if (!p_env) return NULL; + + if (p_env->b_cdtext_error) return NULL; + + if (NULL == p_env->cdtext) { + p_cdtext_data = read_cdtext_osx (p_env); + + if (NULL != p_cdtext_data) { + len = CDIO_MMC_GET_LEN16(p_cdtext_data)-2; + p_env->cdtext = cdtext_init(); + + if(len <= 0 || 0 != cdtext_data_init (p_env->cdtext, &p_cdtext_data[4], len)) { + p_env->b_cdtext_error = true; + cdtext_destroy (p_env->cdtext); + p_env->cdtext = NULL; + } + + free(p_cdtext_data); + } + } + + return p_env->cdtext; +} + +/** Return the media catalog number MCN. */ static char * @@ -1996,8 +2061,8 @@ cdio_open_osx (const char *psz_orig_source) .eject_media = _eject_media_osx, .free = _free_osx, .get_arg = _get_arg_osx, - .get_cdtext = get_cdtext_generic, - .get_cdtext_raw = read_cdtext_generic, + .get_cdtext = get_cdtext_osx, + .get_cdtext_raw = read_cdtext_osx, .get_default_device = cdio_get_default_device_osx, .get_devices = cdio_get_devices_osx, .get_disc_last_lsn = get_disc_last_lsn_osx, |