OK, I converted into using the std.stdio.File. Without success, the programs till crashes.

However, in the meantime:

A) why there is no parameter-less constructor for std.stdio.File? I would like to have into my "init" function: s.filedesc=new File() and, then, in my setter "open" method s.filedesc.open(name,mode). Because I have no such constructor, I am forced to have in the "init": s.filedesc=null; and in the "open": s.filedesc=new File(name,mode). However, in that case, what use for the std.stdio.File.open method? If the name and the mode *must* be known at the construction time, then why ask those once more for the std.stdio.File.open() method? I am forced to open, first, a dummy file (in the constructor), only to be able to call, later, the std.stdio.File.open() method with the correct file name?

B) In my function:
private int msf_open(MSFilter* f, void* arg){ //a setter
printf("msf_binfile_open-start\n============================\n");
        MSF_State* s=cast(MSF_State*)f.data;
        ms_mutex_lock(&(f.lock));
        s.filedesc = new File(*(cast(string*)arg),"w+b");
        printf("s.filedesc=%p+++++++++++++++++++++\n",s.filedesc);
        writef("s.filedesc.isOpen=%b+++++++++++++++++++++\n",s.filedesc.isOpen);
writef("s.filedesc.name=%s+++++++++++++++++++++\n",s.filedesc.name); writef("s.filedesc.size=%d+++++++++++++++++++++\n",s.filedesc.size);
    ms_mutex_unlock(&(f.lock));
        printf("msf_binfile_open-stop\n============================\n");
        return 0;
}

can you tell me if the line s.filedesc=new File(*(cast(string*)arg),"w+b"); PROPAGATES the change into f.data? (recall that MSF_State* s=cast(MSF_State*)f.data;). I should also force, at the end of the function (just before return), something like: free(f.data); f.data=s; to propagate this?

As dumb as it may seem: is my "s" variable in MSF_State* s=cast(MSF_State*)f.data; a POINTER or a VALUE? I should write s->filedesc? Or, maybe, (*s).filedesc? I am a bit lost between pointers (s->x or (*s).x) and values (s.x). For structures there are pointers, for classes there are no pointers?

Finally, the program crash on the same line, when trying to write something in the file. Irony is that the s.filedesc.isOpen shows... 1.

Here is my new "msf_sinker_binaryfile.d file:

=======================msf_sinker_binaryfile.d======================
module msf_sinker_binaryfile;
import std.stdio;

import mediastreamer2_layer;
import msf_commons;

const uint MSF_SINKER_BINARYFILE_OPEN = MS_FILTER_METHOD!(byte)(cast(MSFilterId)MSFilterIdNew.MSF_SINKER_BINARYFILE_ID,0); const uint MSF_SINKER_BINARYFILE_CLOSE = MS_FILTER_METHOD_NO_ARG(cast(MSFilterId)MSFilterIdNew.MSF_SINKER_BINARYFILE_ID,1);

private struct _MSF_State{
        File* filedesc; //file descriptor
};
private alias _MSF_State MSF_State;

private void msf_init(MSFilter* f){ //a constructor
printf("msf_binfile_init-start\n============================\n");
        MSF_State* s=ms_new!(MSF_State)(1);
        s.filedesc = null;
        f.data=s;
        printf("msf_binfile_init-stop\n============================\n");
}

private int msf_open(MSFilter* f, void* arg){ //a setter
printf("msf_binfile_open-start\n============================\n");
        MSF_State* s=cast(MSF_State*)f.data;
        ms_mutex_lock(&(f.lock));
        s.filedesc = new File(*(cast(string*)arg),"w+b");
        printf("s.filedesc=%p+++++++++++++++++++++\n",s.filedesc);
        writef("s.filedesc.isOpen=%b+++++++++++++++++++++\n",s.filedesc.isOpen);
writef("s.filedesc.name=%s+++++++++++++++++++++\n",s.filedesc.name); writef("s.filedesc.size=%d+++++++++++++++++++++\n",s.filedesc.size);
    ms_mutex_unlock(&(f.lock));
        printf("msf_binfile_open-stop\n============================\n");
        return 0;
}

private void msf_process(MSFilter* f){ //a run() method
printf("msf_binfile_process-start\n============================\n");
        MSF_State* s=cast(MSF_State*)f.data;
        mblk_t* m;
while((m=ms_queue_get(f.inputs[0]))!=null){ //reading samples from input
                ms_mutex_lock(&(f.lock));
int len=cast(int)((m.b_wptr-m.b_rptr)); //length of message data block
                byte* p=cast(byte*)m.b_rptr;
                /*printf("----------------------------\n");
        for(int idx=0; idx<len; idx++){
            printf("d_data[%d]=%d\n",idx,d_data[idx]);
        }
                printf("----------------------------\n");*/
                //File filedesc;
                //filedesc.open("newfile.bin","w+b");
                printf("s.filedesc=%p+++++++++++++++++++++\n",s.filedesc);
writef("s.filedesc.isOpen=%b+++++++++++++++++++++\n",s.filedesc.isOpen); //writef("s.filedesc.name=%s+++++++++++++++++++++\n",s.filedesc.name); //SEGFAULT //writef("s.filedesc.size=%d+++++++++++++++++++++\n",s.filedesc.size); //SEGFAULT s.filedesc.writefln("This writes a string to the file."); //SEGFAULT
                //s.filedesc.writeBlock(p,len);
                //filedesc.close();
                ms_mutex_unlock(&(f.lock));
                freemsg(m);
        }
printf("msf_binfile_process-start\n============================\n");
}

private int msf_close(MSFilter* f, void* arg){ //an unsetter
        MSF_State* s=cast(MSF_State*)f.data;
        ms_mutex_lock(&(f.lock));
    s.filedesc.close();
        ms_mutex_unlock(&(f.lock));
        return 0;
}

private void msf_uninit(MSFilter* f){ //a destructor
        MSF_State* s=cast(MSF_State*)f.data;
    msf_close(f, null);
        ms_free(s);
}

private immutable MSFilterMethod[3] msf_methods=[
        
{id:MSF_SINKER_BINARYFILE_OPEN,method:cast(MSFilterMethodFunc)&msf_open},
        
{id:MSF_SINKER_BINARYFILE_CLOSE,method:cast(MSFilterMethodFunc)&msf_close},
        {0,null}
];

immutable MSFilterDesc msf_sinker_binaryfile_desc={
        id:cast(MSFilterId)MSFilterIdNew.MSF_SINKER_BINARYFILE_ID,
        name:"MSFileSink",
        text:"File sink",
        category:MSFilterCategory.MS_FILTER_OTHER,
        ninputs:1,
        noutputs:0,
        init:cast(MSFilterFunc)&msf_init,
        process:cast(MSFilterFunc)&msf_process,
        uninit:cast(MSFilterFunc)&msf_uninit,
        methods:cast(MSFilterMethod*)&msf_methods[0]
};
==============================================================

and here is the output of the program:

-------START PROGRAM-------
ALSA lib conf.c:4687:(snd_config_expand) Unknown parameters 0
ALSA lib control.c:951:(snd_ctl_open_noupdate) Invalid CTL default:0
ortp-warning-Could not attach mixer to card: Invalid argument
ALSA lib conf.c:4687:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM default:0
ALSA lib conf.c:4687:(snd_config_expand) Unknown parameters 0
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM default:0
ortp-warning-Strange, sound card HDA Intel does not seems to be capable of anything, retrying with plughw...
ALSA lib conf.c:4687:(snd_config_expand) Unknown parameters 1
ALSA lib control.c:951:(snd_ctl_open_noupdate) Invalid CTL default:1
ortp-warning-Could not attach mixer to card: Invalid argument
ALSA lib conf.c:4687:(snd_config_expand) Unknown parameters 1
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM default:1
ALSA lib conf.c:4687:(snd_config_expand) Unknown parameters 1
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM default:1
ortp-warning-Strange, sound card HDA ATI HDMI does not seems to be capable of anything, retrying with plughw... ortp-warning-Strange, sound card HDA ATI HDMI seems totally unusable.
msf_binfile_init-start
============================
msf_binfile_init-stop
============================
msf_set_freq-start
============================
msf_set_freq-stop
============================
msf_set_rate-start
============================
msf_set_rate-stop
============================
msf_binfile_open-start
============================
s.filedesc=0x7ff83baacff0+++++++++++++++++++++
s.filedesc.isOpen=1+++++++++++++++++++++
s.filedesc.name=file_givenname.bin+++++++++++++++++++++
s.filedesc.size=0+++++++++++++++++++++
msf_binfile_open-stop
============================
msf_sinusoid_process-start
============================
s.rate=4000.000000============================
msf_sinusoid_process-stop
============================
msf_split_process-start
============================
msf_split_process-stop
============================
msf_dbl2int16_process-start
============================
msf_dbl2int16_process-stop
============================
ortp-warning-alsa_set_params: periodsize:0 Using 64
ortp-warning-alsa_set_params: period:8 Using 8
msf_binfile_process-start
============================
s.filedesc=0x7ff83baacff0+++++++++++++++++++++
s.filedesc.isOpen=1+++++++++++++++++++++
Segmentation fault (core dumped)

Any help?

Reply via email to