[Csnd-dev] arrays in the API
| Date | 2024-08-09 13:56 |
| From | Victor Lazzarini <000010b17ddd988e-dmarc-request@LISTSERV.HEANET.IE> |
| Subject | [Csnd-dev] arrays in the API |
I am now wondering about the best way to give access to arrays in the API. (1) Expose ARRAYDAT: at the moment the array data structure is transparent, so we can access all its members directly. or (2) Provide an interface: we can make the object opaque, providing access through API functions. I can't decide. At the moment, STRINGDAT is opaque but PVSDATEXT is not. I am thinking of changing that one but have not decided yet. Option 2 is safer but may be cumbersome for users. Prof. Victor Lazzarini Maynooth University Ireland |
| Date | 2024-08-09 18:49 |
| From | Rory Walsh |
| Subject | Re: [Csnd-dev] arrays in the API |
I'd be leaning towards making it opaque and doing the same for PVSDATEXT. On Fri, 9 Aug 2024 at 14:56, Victor Lazzarini <000010b17ddd988e-dmarc-request@listserv.heanet.ie> wrote: I am now wondering about the best way to give access to arrays in the API. |
| Date | 2024-08-10 18:06 |
| From | vlz |
| Subject | Re: [Csnd-dev] arrays in the API |
Agreed. I have a design for this and I'll go ahead and implement. Prof. Victor Lazzarini Maynooth University Ireland On 9 Aug 2024, at 18:49, Rory Walsh <rorywalsh@ear.ie> wrote:
|
| Date | 2024-08-10 19:27 |
| From | vlz |
| Subject | Re: [Csnd-dev] [EXTERNAL] [Csnd-dev] arrays in the API |
Ok I have changed the interface. We get the channel pointer and then use API to
access the array data.
Here’s a test program
int main(int argc, char **argv) {
CSOUND *csound;
ARRAYDAT *adat, *adat2;
const MYFLT *data;
MYFLT indata[4] = {5,6,7,8};
int n, siz;
const char *code = R"ORC(
instr 1
kArr[] fillarray 1,2,3,4 // array data for output
kArr2[] init 4 // array data for input
chnset kArr, "testout" // set channel
kArr2[] chnget "testin" // get channel
printarray kArr2 // print channel
endin
)ORC";
csound = csoundCreate(NULL, NULL);
csoundSetOption(csound,"-n");
csoundCompileOrc(csound, code, 0);
csoundEventString(csound, "i1 0 1", 0);
csoundStart(csound);
// perform once
csoundPerformKsmps(csound);
// access channels directly
csoundGetChannelPtr(csound, (void **) &adat, "testout", CSOUND_ARRAY_CHANNEL
| CSOUND_OUTPUT_CHANNEL);
csoundGetChannelPtr(csound, (void **) &adat2, "testin", CSOUND_ARRAY_CHANNEL
| CSOUND_INPUT_CHANNEL);
// get channel data
data = (const MYFLT *) csoundGetArrayData(adat);
siz = csoundArrayDataSizes(adat)[0];
for(n = 0; n < siz; n++)
printf("[%d]: %f \n", n, data[n]);
// set channel data
csoundSetArrayData(adat2, (void *) indata);
// perform again
csoundPerformKsmps(csound);
csoundDestroy(csound);
return 0;
}
> On 10 Aug 2024, at 18:06, vlz |
| Date | 2024-08-10 21:26 |
| From | Steven Yi |
| Subject | Re: [Csnd-dev] [EXTERNAL] [Csnd-dev] arrays in the API |
I need to catch up with all of this, but I had the thought we could be exposing channels as CS_VARIABLE's and creating an API around reading/writing CS_VARIABLE. It'd make it a little easier for channels to have one csoundGetChannelVar() function and then have functions to interrogate the type and call appropriate functions to work with the variable. On Sat, Aug 10, 2024 at 2:28 PM vlz |
| Date | 2024-08-10 21:55 |
| From | vlz |
| Subject | Re: [Csnd-dev] [EXTERNAL] [Csnd-dev] arrays in the API |
Ok, see what you think of the current state and if you feel we need to modify the interface and introduce CS_VARIABLEs, then we need to come up with a plan. At the moment, I have basically kept the same interface and extended it to handle arrays. I think opaque types are probable the best way forward in any case. Prof. Victor Lazzarini Maynooth University Ireland > On 10 Aug 2024, at 21:26, Steven Yi |