/** * @brief Create a MIDIDriverAppleMIDI instance. * Allocate space and initialize an MIDIDriverAppleMIDI instance. * @public @memberof MIDIDriverAppleMIDI * @return a pointer to the created driver structure on success. * @return a @c NULL pointer if the driver could not created. */ struct MIDIDriverAppleMIDI *MIDIDriverAppleMIDICreate(char *name, unsigned short port) { struct MIDIDriverAppleMIDI *driver; MIDITimestamp timestamp; driver = kmalloc(sizeof(struct MIDIDriverAppleMIDI), GFP_KERNEL); if (driver == NULL) { return NULL; } pr_debug("placed driver at %p\n", driver); spin_lock_init(&(driver->lock)); pr_debug("allocated driver structure\n"); MIDIDriverInit(&(driver->base), name, APPLEMIDI_CLOCK_RATE, (void *)driver); driver->control_socket = NULL; driver->rtp_socket = NULL; driver->port = port; driver->accept = 0xff; driver->sync = 0; strncpy(&(driver->name[0]), name, sizeof(driver->name)); driver->name[31] = 0; // driver->in_queue = MIDIMessageQueueCreate(); // driver->out_queue = MIDIMessageQueueCreate(); // driver->base.send = &_driver_send; // driver->base.destroy = &_driver_destroy; _applemidi_connect(driver); pr_debug("connected sockets\n"); driver->peer = NULL; driver->rtp_session = RTPSessionCreate(driver->rtp_socket); driver->rtpmidi_session = RTPMIDISessionCreate(driver->rtp_session); MIDIClockGetNow(driver->base.clock, ×tamp); pr_debug("init timestamp with %lld\n", timestamp); driver->token = timestamp; memset(&(driver->command), 0, sizeof(driver->command)); driver->command.peer = NULL; setup_timer(&driver->timer, _applemidi_idle_timeout, (unsigned long)driver); mod_timer(&driver->timer, jiffies + msecs_to_jiffies(5000)); return driver; }
/** * @brief Create a MIDIDriverAppleMIDI instance. * Allocate space and initialize an MIDIDriverAppleMIDI instance. * @public @memberof MIDIDriverAppleMIDI * @return a pointer to the created driver structure on success. * @return a @c NULL pointer if the driver could not created. */ struct MIDIDriverAppleMIDI * MIDIDriverAppleMIDICreate( char * name, unsigned short port ) { struct MIDIDriverAppleMIDI * driver; MIDITimestamp timestamp; int ret = 0; driver = malloc( sizeof( struct MIDIDriverAppleMIDI ) ); MIDIPrecondReturn( driver != NULL, ENOMEM, NULL ); MIDIDriverInit( &(driver->base), name, APPLEMIDI_CLOCK_RATE ); driver->control_socket = 0; driver->rtp_socket = 0; driver->port = port; driver->accept = 0; driver->sync = 0; strncpy( &(driver->name[0]), name, sizeof(driver->name) ); driver->in_queue = MIDIMessageQueueCreate(); driver->out_queue = MIDIMessageQueueCreate(); driver->base.send = &_driver_send; driver->base.destroy = &_driver_destroy; ret = _applemidi_connect( driver ); if (ret==-1) MIDILog( ERROR, "Bind failed for port: %hu\n", port); driver->peer = NULL; driver->rtp_session = RTPSessionCreate( driver->rtp_socket ); driver->rtpmidi_session = RTPMIDISessionCreate( driver->rtp_session ); MIDIClockGetNow( driver->base.clock, ×tamp ); MIDILog( DEBUG, "initial timestamp: %lli\n", timestamp ); driver->token = timestamp; memset( &(driver->command), 0, sizeof(driver->command) ); driver->command.peer = NULL; _applemidi_init_runloop_source( driver ); return driver; }