Example #1
0
/**
 * @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, &timestamp);

	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;
}
Example #2
0
/**
 * @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, &timestamp );
  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;
}