पाइथन सी एपीआई का उपयोग करते समय MIDIGetNumberOfDestinations 0 लौट रहा है

मेरे पास पाइथन 3 के लिए निम्न मिडी रैपर है:

#include 
#include "structmember.h"
#include 
#include "stdio.h"

#define MESSAGESIZE 3

// CFStringRef to char*
char * MYCFStringCopyUTF8String(CFStringRef aString) {
  if (aString == NULL) {
    return NULL;
  }

  CFIndex length = CFStringGetLength(aString);
  CFIndex maxSize =
  CFStringGetMaximumSizeForEncoding(length,
                                    kCFStringEncodingUTF8);
  char *buffer = (char *)malloc(maxSize);
  if (CFStringGetCString(aString, buffer, maxSize,
                         kCFStringEncodingUTF8)) {
    return buffer;
  }
  return NULL;
}

typedef struct {
    PyObject_HEAD
} Midi;

static void Midi_dealloc(Midi* self)
{
    Py_TYPE(self)->tp_free((PyObject*)self);
}

static int Midi_init(Midi *self)
{
    ItemCount nDests = MIDIGetNumberOfDestinations();
    printf("INIT\n");
    for (ItemCount i = 0 ; i < nDests ; ++i) {

      //Grab a reference to current device
       MIDIDeviceRef device = MIDIGetDevice(i);
       CFStringRef name = nil;
       MIDIObjectGetStringProperty(device, kMIDIPropertyName, &name);
       printf("%s\n", MYCFStringCopyUTF8String(name));
    }
    printf("END\n");    
    return 0;
}

static PyObject * Midi_add(Midi* self, PyObject *args)
{
      return Py_None;
}

static PyObject * Midi_bend(Midi* self, PyObject *args)
{
       return Py_None;
}

static PyObject * Midi_play(Midi* self)
{
    return Py_None;
}

static PyMethodDef Midi_methods[] = 
{
    {"add", (PyCFunction)Midi_add, METH_VARARGS, "Add note"},
    {"bend", (PyCFunction)Midi_bend, METH_VARARGS, "Bend note"},
    {"play", (PyCFunction)Midi_play, METH_NOARGS, "Play Notes"},
    {NULL}  /* Sentinel */
};

static PyTypeObject MidiType = {
    PyVarObject_HEAD_INIT(NULL, 0)
    "midi.Midi",             /* tp_name */
    sizeof(Midi),             /* tp_basicsize */
    0,                         /* tp_itemsize */
    (destructor)Midi_dealloc, /* tp_dealloc */
    0,                         /* tp_print */
    0,                         /* tp_getattr */
    0,                         /* tp_setattr */
    0,                         /* tp_reserved */
    0,                         /* tp_repr */
    0,                         /* tp_as_number */
    0,                         /* tp_as_sequence */
    0,                         /* tp_as_mapping */
    0,                         /* tp_hash  */
    0,                         /* tp_call */
    0,                         /* tp_str */
    0,                         /* tp_getattro */
    0,                         /* tp_setattro */
    0,                         /* tp_as_buffer */
    Py_TPFLAGS_DEFAULT |
        Py_TPFLAGS_BASETYPE,   /* tp_flags */
    "Midi objects",           /* tp_doc */
    0,                     /* tp_traverse */
    0,                     /* tp_clear */
    0,                     /* tp_richcompare */
    0,                     /* tp_weaklistoffset */
    0,                     /* tp_iter */
    0,                     /* tp_iternext */
    Midi_methods,             /* tp_methods */
    0,                  /* tp_members */
    0,                         /* tp_getset */
    0,                         /* tp_base */
    0,                         /* tp_dict */
    0,                         /* tp_descr_get */
    0,                         /* tp_descr_set */
    0,                         /* tp_dictoffset */
    (initproc)Midi_init,      /* tp_init */
};

static PyModuleDef midimodule = {
    PyModuleDef_HEAD_INIT,
    "midi",
    "Midi Module",
    -1,
    NULL, NULL, NULL, NULL, NULL
};

PyMODINIT_FUNC
PyInit_midi(void) 
{
    PyObject* m;

    MidiType.tp_new = PyType_GenericNew;
    if (PyType_Ready(&MidiType) < 0)
        return NULL;

    m = PyModule_Create(&midimodule);
    if (m == NULL)
        return NULL;

    Py_INCREF(&MidiType);
    PyModule_AddObject(m, "Midi", (PyObject *)&MidiType);
    return m;
}

निम्न setup.py फ़ाइल के साथ:

from distutils.core import setup, Extension

module = Extension('midi', sources = ['midi.c'],  extra_link_args=['-framework', 'CoreMIDI', '-framework', 'CoreFoundation'])

setup (name = 'Midi',
       version = '1.0',
       description = 'Midi Controller',
       ext_modules = [module])

मैं फिर इस पायथन कोड चलाता हूं, लेकिन यह मुझे देता है:

import midi
m = midi.Midi()

लेकिन यह केवल मैवरिक्स पर आउटपुट करता है:

INIT
END

अर्थात। यह कोई डिवाइस नहीं पाता है।

मैंने यह भी कोशिश की है:

#import 

char * MYCFStringCopyUTF8String(CFStringRef aString) {
  if (aString == NULL) {
    return NULL;
  }

  CFIndex length = CFStringGetLength(aString);
  CFIndex maxSize =
  CFStringGetMaximumSizeForEncoding(length,
                                    kCFStringEncodingUTF8);
  char *buffer = (char *)malloc(maxSize);
  if (CFStringGetCString(aString, buffer, maxSize,
                         kCFStringEncodingUTF8)) {
    return buffer;
  }
  return NULL;
}

int main(int argc, char *argv[])
{
 //How many MIDI devices do we have?
  ItemCount deviceCount = MIDIGetNumberOfDevices();

 //Iterate through all MIDI devices
  for (ItemCount i = 0 ; i < deviceCount ; ++i) {

   //Grab a reference to current device
    MIDIDeviceRef device = MIDIGetDevice(i);
    CFStringRef name = nil;
    MIDIObjectGetStringProperty(device, kMIDIPropertyName, &name);
    printf("%s\n", MYCFStringCopyUTF8String(name));


}
}

निम्नलिखित फ़ाइल बनाने के साथ:

SRCS =      midi2.c
OBJS =      midi2.o
LIBS =      -framework CoreMIDI -framework CoreFoundation 
TARGET =    Midi2 

$(TARGET):  $(OBJS)
    $(CC) -o $(TARGET) $(SRCS) $(LIBS)

all:    $(TARGET)

clean:
    rm -f $(OBJS) $(TARGET)

जो मेरे midi उपकरणों को सही ढंग से सूचीबद्ध करता है। मैं क्या गलत कर रहा हूं?

0
@twil मैं डीबग क्या कर सकता हूं? फ़ंक्शन 2 लौटाता है जब इसे एक बहुत ही सरल सी फ़ंक्शन से कहा जाता है और 0 जब पाइथन के सी एपीआई का उपयोग किया जाता है। मुझे लगता है कि समस्या एक लिंकर है, भले ही मुझे पाइथन सेटअप इंस्टॉल करने पर कोई त्रुटि न हो। उदाहरण के लिए, मैं setup.py फ़ाइल में "CoreMIDI" को "Foo" में बदल सकता हूं और मुझे कोई त्रुटि नहीं मिलती है।
जोड़ा लेखक Baz, स्रोत
MIDIGetNumberOfDestinations() "सिस्टम में गंतव्यों की संख्या, या 0 त्रुटि होने पर 0" लौटाता है। क्या आपने इसे किसी भी तरह डीबग करने की कोशिश की है?
जोड़ा लेखक twil, स्रोत
पाइथन उदाहरण में आप MIDIGetNumberOfDestinations() क्यों कॉल कर रहे हैं, लेकिन सी उदाहरण में MIDIGetNumberOfDevices() ?
जोड़ा लेखक Kurt Revis, स्रोत

1 उत्तर

समस्या यह थी कि मेरा आईएसी चालक ऑफ़लाइन था। ड्राइवर डिफ़ॉल्ट रूप से ऑफ़लाइन है।

0
जोड़ा