On Friday, 16 April 2021 at 17:50:13 UTC, Alain De Vos wrote:
The following very simple low level C-function simply sets the
mixer volume. How to convert this simple function to dlang ?
```
void mixer_setlevel_stereo(int mixfd,int dev,int left,int right)
{
left+=256*right;
#int_ioctl(int fd, unsigned long request, ...);
ioctl(mixfd,
((unsigned long) (((0x80000000UL|0x40000000UL)) |
(((sizeof(int)) & ((1 << 13) - 1)) << 16) | ((('M')) << 8) |
((dev)))),
&left);
}
```
You could change `sizeof(int)` to `int.sizeof` and `(unsigned
long)` to `cast(uint)` in this case, but it seems you expanded
the IOWR macro resulting in the ugly mess of bitwise operations.
I did a search for your function name and found what I think is
the original C code:
```C
void mixer_setlevel_stereo(int mixfd,int dev,int left,int right)
{
left+=256*right;
ioctl(mixfd,MIXER_WRITE(dev),&left);
}
```
Looking at my `/usr/include/linux/soundcard.h:`
```
#define MIXER_WRITE(dev) _SIOWR('M', dev, int)
```
And _SIOWR looks identical to IOWR, so I think this is a correct
translation:
```D
import core.sys.posix.sys.ioctl: ioctl, _IOWR;
void mixer_setlevel_stereo(int mixfd, int dev, int left, int
right)
{
left += 256 * right;
ioctl(mixfd, _IOWR!int('M', dev), &left);
}
```