libcdio.git - libcdio

index : libcdio.git
libcdio
summary refs log tree commit diff
diff options
context:
space:
mode:
authorR. Bernstein <rocky@users.noreply.github.com>2025年01月03日 18:46:33 -0500
committerRobert Kausch <robert.kausch@freac.org>2025年01月04日 16:30:07 +0100
commitb5d1bf244900f84d2da0fc9053c729ddc8ee47a9 (patch)
tree9ba11c969e472a6ec5a64f6e8c526dd084c70a00
parent42226fa48a670475a1c3cbbd33319f43fb678800 (diff)
downloadlibcdio-b5d1bf244900f84d2da0fc9053c729ddc8ee47a9.tar.gz
Merge pull request #10 from enzo1982/cdtext-osx
Support reading CD-Text on macOS
Diffstat
-rw-r--r--lib/driver/osx.c 69
1 files changed, 67 insertions, 2 deletions
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,
generated by cgit v1.2.3 (git 2.25.1) at 2025年09月04日 15:43:44 +0000

AltStyle によって変換されたページ (->オリジナル) /