Re: [Csnd-dev] [EXTERNAL] [Csnd-dev] Spaces in csoundSetOption
Eduardo Moguillansky <[email protected]>
| Newsgroups | gmane.comp.audio.csound.devel |
|---|---|
| Message-ID | <CAHFFssJibgkykAPm1mygutR1b7VR9tSD_WyjagOWrzpQTH9qNA@mail.gmail.com> |
Thanks, Victor! I tested the PR and it works as expected. On Thu, Jan 9, 2025 at 4:45 PM Victor Lazzarini < [email protected]> wrote: > I don’t think this will work on the command-line > > csound -odac:Built-in Audio > > but this will > > csound -odac:"Built-in Audio" > > so you will need to quote your strings if there are spaces in them. > Previously with a single option this wasn’t needed > because it was taken as a one full option. However, to get more than one > option, I have to tokenise in the form > expected by Csound. > > I have added support for strings to the PR. So you can now do > > res = csoundSetOption(csound, "-odac:\"Built-in Audio\"”); > > ======================== > Prof. Victor Lazzarini > Maynooth University > Ireland > > > On 9 Jan 2025, at 13:26, Eduardo Moguillansky < > [email protected]> wrote: > > > > The problem was with calls of the form > > > > res = csoundSetOption(csound, "-odac:Built-in Audio"); > > > > or similar, which are common in linux systems running pipewire. I see > similar problems with midi devices with spaces. > > > > On Thu, Jan 9, 2025 at 12:29 PM vlz <[email protected]> wrote: > > Multiple whitespaces are now properly accounted for in #2078. > > > > > On 9 Jan 2025, at 10:12, vlz <[email protected]> wrote: > > > > > > I checked and this code works > > > > > > res = csoundSetOption(csound, "-o dac -m 6"); > > > > > > so you can have spaces between the arguments. There is a problem with > more than a single space, which I > > > can look into. > > > > > >> On 9 Jan 2025, at 09:55, vlz <[email protected]> wrote: > > >> > > >> *Warning* > > >> This email originated from outside of Maynooth University's Mail > System. Do not reply, click links or open attachments unless you recognise > the sender and know the content is safe. > > >> I wrote this new code, because the 6.x version was problematic. I can > look into improving it. > > >> > > >> Prof. Victor Lazzarini > > >> Maynooth University > > >> Ireland > > >> > > >>> On 9 Jan 2025, at 09:17, Eduardo Moguillansky < > [email protected]> wrote: > > >>> > > >>> Hi, > > >>> > > >>> Directly using the API in c (csound 7) I don't seem to be able to > set an option which includes a space. In particular, setting the -o or > --output option with a device which includes a space does not seem to work > in any case. Looking at the source code it seems that a very naive string > splitting code was added to csound 7. > > >>> > > >>> csound 6 > > >>> > > >>> PUBLIC int csoundSetOption(CSOUND *csound, const char *option){ > > >>> /* if already compiled and running, return */ > > >>> if (csound->engineStatus & CS_STATE_COMP) return 1; > > >>> else { > > >>> const char *args[2] = {"csound", option}; > > >>> csound->info_message_request = 1; > > >>> return (argdecode(csound, 1, args) ? 0 : 1); > > >>> } > > >>> } > > >>> > > >>> csound 7 > > >>> > > >>> /* count whitespaces */ > > >>> while (*sp++ != '\0') { > > >>> if (*sp == ' ') { > > >>> cnt++; > > >>> *sp = '\0'; > > >>> sp++; > > >>> } > > >>> } > > >>> args = (char **)mcalloc(csound, sizeof(char *) * (cnt + 2)); > > >>> args[0] = "csound"; > > >>> args[1] = sp = options; > > >>> cnt = 1; > > >>> /* split into separate args */ > > >>> while (*opt) { > > >>> if (*opt == ' ') { > > >>> args[++cnt] = sp + 1; > > >>> } > > >>> sp++; > > >>> opt++; > > >>> } > > >>> > > >>> ret = argdecode(csound, cnt, (const char **)args); > > >>> mfree(csound, args); > > >>> mfree(csound, options); > > >>> > > >>> I don't know the rationale behind this inclusion but I think that at > least some form of escaping or quotation should be added to the splitting. > For me the actual solution would be to remove the splitting at the API > level. > > >>> > > >>> cheers > > >>> Eduardo > >