Hi,
The code below works perfectly under Ubuntu 20, but does not work on the Raspberry PI (both 64 bit Os).
When I run amidi -l the hardware is recognized but my pb code does not.
When I check the imported functions, all existing ones are the same as under Ubuntu.
So what or where is my code wrong ?
Thanks.
Code: Select all
;{*********************************************************************************************
ImportC "-lasound"
snd_card_next(*card)
snd_rawmidi_info_set_stream(*info, device.l)
snd_rawmidi_info_get_subdevices_count(*info)
snd_ctl_rawmidi_info(*ctl, *info)
snd_ctl_rawmidi_next_device(*ctl, device.l)
snd_rawmidi_info_set_device(*info, idx.l)
snd_rawmidi_info_set_subdevice(*info, idx.l)
snd_ctl_open(*ctl, name.p-utf8, mode.l)
snd_ctl_close(*ctl)
;Voorbeeld uit library in C-formaat
snd_card_get_longname(card.l, *pName)
snd_card_get_name(card.l, *pName)
snd_strerror(status.l)
snd_rawmidi_info_sizeof()
snd_rawmidi_info_get_name(*info)
snd_rawmidi_info_get_subdevice_name(*info)
;*********************************************************************************************
snd_seq_queue_tempo_sizeof()
;*********************************************************************************************
;funkties om midi data te verstufern :
;*********************************************************************************************
;snd_rawmidi_open_lconf(*input, *output, name.p-ascii, mode.l, var.i)
snd_rawmidi_open(*input, *output, name.p-ascii, mode.l)
snd_rawmidi_write(*output, *buffer, size.l)
snd_rawmidi_read(*input, *buffer, size.l)
snd_rawmidi_drain(*output)
snd_rawmidi_close(*output)
snd_rawmidi_nonblock(*output, mode.l)
;************************************************************************************
EndImport
Structure snd_rawmidi_info Align #PB_Structure_AlignC
device.l; /* RO/WR (control): device number */
subdevice.l; /* RO/WR (control): subdevice number */
stream.l ; /* WR: stream */
card.l ; /* R: card number */
flags.l ; /* SNDRV_RAWMIDI_INFO_XXXX */
id.a[64] ; /* ID (user selectable) */
name.a[80] ; /* name of device */
subname.a[32]; /* name of active or selected subdevice */
subdevices_count.l;
subdevices_avail.l;
reserved.a[64] ; /* reserved for future use */
EndStructure
Enumeration
#SND_RAWMIDI_STREAM_OUTPUT
#SND_RAWMIDI_STREAM_INPUT
EndEnumeration
Global NewList io_poort.s()
;}*********************************************************************************************
Procedure Is_Input(*ctl, card.l, device.l, sub.l)
Protected *info. snd_rawmidi_info, status.l, name.s
*info = AllocateMemory(snd_rawmidi_info_sizeof())
snd_rawmidi_info_set_device(*info, device)
snd_rawmidi_info_set_subdevice(*info, sub)
snd_rawmidi_info_set_stream(*info, #SND_RAWMIDI_STREAM_INPUT)
status=snd_ctl_rawmidi_info(*ctl, *info)
If status<0
FreeMemory( *info)
Else
AddElement(io_poort())
io_poort() ="I;"+PeekS(@*info\subname, -1, #PB_UTF8) + ";hw:"+ Str(*info\card) +","+ Str(*info\device) + ","+ Str(*info\subdevice)
FreeMemory( *info)
EndIf
EndProcedure
Procedure Is_Output(*ctl, card.l, device.l, sub.l)
Protected *info. snd_rawmidi_info, status.l, name.s
*info = AllocateMemory(snd_rawmidi_info_sizeof()) ;268
snd_rawmidi_info_set_device(*info, device)
snd_rawmidi_info_set_subdevice(*info, sub)
snd_rawmidi_info_set_stream(*info, #SND_RAWMIDI_STREAM_OUTPUT)
status=snd_ctl_rawmidi_info(*ctl, *info)
If status<0
FreeMemory( *info)
Else
AddElement(io_poort())
io_poort() ="O;"+PeekS(@*info\subname, -1, #PB_UTF8) + ";hw:"+ Str(*info\card) +","+ Str(*info\device) + ","+ Str(*info\subdevice)
FreeMemory( *info)
EndIf
EndProcedure
Procedure List_Subdevices_Info(*ctl, card.l, device.l)
Protected *info. snd_rawmidi_info, name$, subname$
Protected.l subs_in, subs_out, a
*info = AllocateMemory(snd_rawmidi_info_sizeof())
snd_rawmidi_info_set_device(*info, device)
snd_rawmidi_info_set_stream(*info, #SND_RAWMIDI_STREAM_INPUT)
snd_ctl_rawmidi_info(*ctl, *info)
subs_in = *info\subdevices_count ;Resultaat is idem aan snd_rawmidi_info_get_subdevices_count(*info)
For a=0 To subs_in-1
is_input(*ctl, card, device, a)
Next
snd_rawmidi_info_set_stream(*info, #SND_RAWMIDI_STREAM_OUTPUT)
snd_ctl_rawmidi_info(*ctl, *info)
subs_out=*info\subdevices_count ;Resultaat is idem aan snd_rawmidi_info_get_subdevices_count(*info)
For a=0 To subs_out-1
is_output(*ctl, card, device, a)
Next
FreeMemory( *info)
EndProcedure
Procedure List_Midi_Devices_On_Card(card.l)
Protected *ctl, *info. snd_rawmidi_info, name$, device.l
device=-1
name$ = "hw:" + Str(card)
If snd_ctl_open(@*ctl, name$, 0)<0
MessageRequester("No Card.","cannot open control for card: " + name$, #PB_MessageRequester_Ok)
ProcedureReturn
EndIf
Repeat
If snd_ctl_rawmidi_next_device(*ctl, @device)<0
MessageRequester("No Card.","cannot determine device number:: " + Str( device), #PB_MessageRequester_Ok)
ElseIf device=>0
list_subdevices_info(*ctl, card, device)
EndIf
Until device<0
snd_ctl_close(*ctl)
EndProcedure
Procedure Discover_Midi_Ports()
Protected.l card
card = -1 ; // use -1 to prime the pump of iterating through card list
If snd_card_next(@card)<0
MessageRequester("No Card.","Cannot determine card number: " + Str(card), #PB_MessageRequester_Ok)
EndIf
If card<0
MessageRequester("No Card.","No sound cards found", #PB_MessageRequester_Ok)
EndIf
While card=>0
list_midi_devices_on_card(card)
snd_card_next(@card)
Wend
EndProcedure
;*********************************************************************************************
Procedure Show_Midi_Inputs(hnd.i, active.i=-1)
ForEach io_poort()
If StringField(io_poort(),1,";")="I"
; AddGadgetItem (hnd, -1, StringField(io_poort(),2,";") + #TAB$+StringField(io_poort(),3,";"))
Debug StringField(io_poort(),2,";")+ #TAB$+StringField(io_poort(),3,";")
EndIf
Next
;SetGadgetState(hnd, active)
Debug "--------------------"
EndProcedure
Procedure Show_Midi_Outputs(hnd.i, active.i=-1)
ForEach io_poort()
If StringField(io_poort(),1,";")="O"
;AddGadgetItem (hnd, -1, StringField(io_poort(),2,";")+ #TAB$+StringField(io_poort(),3,";"))
Debug StringField(io_poort(),2,";")+ #TAB$+StringField(io_poort(),3,";")
EndIf
Next
; SetGadgetState(hnd, active)
EndProcedure
Discover_Midi_Ports()
;Show_Midi_Inputs(0)
Show_Midi_Outputs(0)