Add support for reading CD-Text on macOS - libcdio.git - libcdio

index : libcdio.git
libcdio
summary refs log tree commit diff
diff options
context:
space:
mode:
authorRobert Kausch <robert.kausch@freac.org>2023年03月23日 22:17:46 +0100
committerRobert Kausch <robert.kausch@freac.org>2023年03月23日 22:17:46 +0100
commitd130f7601346623b790a6b199b445902cb82deb7 (patch)
tree299d74f6e616a88531ab109f61eec30364972641
parent6f2426e8bf4dc5269ccbd9fbfa94340895f8be6e (diff)
downloadlibcdio-cdtext-osx.tar.gz
Add support for reading CD-Text on macOScdtext-osx
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 af2fe402..7cfa2f9e 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.39.1) at 2025年09月07日 04:08:18 +0000

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