BASS for WinCE

Started by Ian @ un4seen,

hc_dondon

i just want to ask why it wont play in another device. This code play no problem with a china based Device, i tried korean and it shows the error.(iStation PMP WincE5.0)

private void InitWavHeader(){           
FFileStream = new FileStream(FFileName,FileMode.Create,FileAccess.Write);
         FBinaryWriter = new BinaryWriter(FFileStream);
         FBinaryWriter.Write(new char[4] { 'R', 'I', 'F', 'F' });
         FBinaryWriter.Write((int)36);  //Chunksize
            FBinaryWriter.Write(new char[8] {'W','A','V','E','f','m','t',' '}); //format
            FBinaryWriter.Write((int)16); // SubChunk1Size : 16 for PCM
            FBinaryWriter.Write((short)1); //AudioFormat: 1 for PCM
            FBinaryWriter.Write((short)1); // NumChannels: 1 for Mono, 2 for Stereo
            FBinaryWriter.Write((int)22050); //Sample Rate
            FBinaryWriter.Write((int)88200); //Byte Rate
            FBinaryWriter.Write((short)2); //Block Align
            FBinaryWriter.Write((short)16); // Bits per Sample
            FBinaryWriter.Write(new char[4]{'d','a','t','a'});
            FBinaryWriter.Write((int)0); //Data Length: Initialize length to 0;
}

recordStream = Bass.BASS_RecordStart(22050, 1, BASSFlag.BASS_RECORD_PAUSE, myRecordProc, IntPtr.Zero);
i checked the error code after the call and it returned BASS_ERROR_FORMAT

Ian @ un4seen

BASS_ERROR_FORMAT indicates that the device doesn't support the requested sample format, eg. 22050hz mono 16-bit in your example. Are you able to record in that format on that device with other software? Also, if you call BASS_RecordGetInfo, what "formats" value do you get?

hc_dondon

yes, the device has a built in recorder that records wav also. I haven't tried BASS_RecordGetInfo yet. i will try it today. thanks.

hc_dondon

Hi, here is the recordgetinfo result on this device. format is WAVE_FORMAT_UNKNOWN
i have tried also making it to 44100 still same result.


hc_dondon


this is the sample file details that was recorded using the built-in recorder of the device that doesn't work.


Ian @ un4seen

Quote from: hc_dondoni have tried also making it to 44100 still same result.

Did you also try stereo, ie. 44100hz stereo 16-bit, as in your recording from the built-in recorder?

recordStream = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_RECORD_PAUSE, myRecordProc, IntPtr.Zero);

hc_dondon

@Ian
 i tried it using the info you gave me, it can record and create the file..but when i tried to copy the recorded audio and open it in wavosaur(free audio editing) it has no peaks, i tried to open it through mediaplayer but it just silence.

hc_dondon

I tried also to use EncodeWav to create the wav instead of my own waveheader. It can record but i can't hear my voice.
this is the sample output file now but can't hear anything on it.

<a href=http://www.filedropper.com/record><img src=http://www.filedropper.com/download_button.png width=127 height=145 border=0/></a><br /> <div style=font-size:9px;font-family:Arial, Helvetica, sans-serif;width:127px;font-color:#44a854;> <a href=http://www.filedropper.com > FileDropper Free File Hosting</a></div>

pls help.


Ian @ un4seen

Another user had a similar issue with a particular device, which required some special code to enable recording, so perhaps the built-in recorder is doing something like that on your device. Are you able to capture sound on it with any other 3rd-party software? Btw, I guess the built-in recorder is capturing sound?

Please also post your code, just to be sure there isn't a problem in that.

hc_dondon

It is indeed very strange, even the spectrum code, won't show any peaks. When i tried same code in another device it will record and functioning very well. i will try to post my code here. I did not try any third party except from the builtin recorder that the device has provided. I will try to find 3rd party recorder and try it in that device. I also ask for the code from the maker of that device they provided me C++ code but i don't know how to use it. if you want i can email it for you. would you give me email so that i can just email you my code.

Ian @ un4seen

If the problem also affects the included examples (eg. LIVESPEC and RECTEST), then it isn't something specific to your code, but if you would like me to have a look at the code provided by the device manufacturer, you can upload that here...

   ftp.un4seen.com/incoming/

hc_dondon

i have uploaded all files in your ftp: all filenames start with hc_dondon text.

kindly look at it

thanks again.

Ian @ un4seen

It looks like the device has a "Set_DQ_AudInput" function to set the recording input, but it's in a LIB file and I don't think you can use LIB files directly with .Net? Perhaps, if you ask, they could provide you a DLL to use instead.

hc_dondon

It is working great now. :)
I get the dll and use it using dll import

Thanks guys.

thirtyparity

What is the best device to use bass with its optimal performance?

simon.chen

hi, Ivan

i use BASS_ChannelSetSync method to do something when Play to End. but my SYNCPROC was not called.

private SYNCPROC _mySyncProc;
...
_mySyncProc = new SYNCPROC(MySync);
musicHandle = Bass.BASS_StreamCreateFile(this.mp3FilePath + this.mp3FileName, 0, 0, 0);
if (musicHandle != 0)
{
    if (Bass.BASS_ChannelPlay(musicHandle, true))
   {
         Bass.BASS_ChannelSetSync(musicHandle, BASSSync.BASS_SYNC_END | BASSSync.BASS_SYNC_ONETIME, 0, _mySyncProc, IntPtr.Zero);
    }
}

private void MySync(int syncHandle, int channel, int data, IntPtr user)
{
     ....//
}

and, when it stop itself at the pos 34185544(Total is 34246656), not the end. not only one mp3 file, but also all my mp3 file is stoped at nearly the end, but not the end. so my SYNCPROC cannot be called. Is there any wrong?

EEh

It possible to get sound output breaks when WiFi and Bluetooth are turned on at one time.

I suppose, it happens because of playback BASS thread is displaced by threads with higher priority (like WiFi and Bluetooth threads as in our case). Device buffer size increasing (BASS_CONFIG_DEV_BUFFER) does not solve proplem. Also, I was trying to turn off auto-updates in BASS and make my own updates (BASS_ChannelUpdate, BASS_Update) from thread with higher priority value than BASS uses (I set windows ce priority to 128), but sound breaks are still audible.

How can I control and change BASS playback thread priority value? Is it possible to make new config option (BASS_SetConfig)?

OS: Windows Mobile 6.1

Ian @ un4seen

Quote from: thirtyparityWhat is the best device to use bass with its optimal performance?

Are you referring to the CPU used by the device, eg. ARM/MIPS/x86?

Quote from: simon.cheni use BASS_ChannelSetSync method to do something when Play to End. but my SYNCPROC was not called.

private SYNCPROC _mySyncProc;
...
_mySyncProc = new SYNCPROC(MySync);
musicHandle = Bass.BASS_StreamCreateFile(this.mp3FilePath + this.mp3FileName, 0, 0, 0);
if (musicHandle != 0)
{
    if (Bass.BASS_ChannelPlay(musicHandle, true))
   {
         Bass.BASS_ChannelSetSync(musicHandle, BASSSync.BASS_SYNC_END | BASSSync.BASS_SYNC_ONETIME, 0, _mySyncProc, IntPtr.Zero);
    }
}

private void MySync(int syncHandle, int channel, int data, IntPtr user)
{
     ....//
}

and, when it stop itself at the pos 34185544(Total is 34246656), not the end. not only one mp3 file, but also all my mp3 file is stoped at nearly the end, but not the end. so my SYNCPROC cannot be called. Is there any wrong?

I tested setting an END sync just now, and it was fine. It shouldn't be file-specific, but if you like, you can upload a troublesome file to try here...

   ftp.un4seen.com/incoming/

Btw, I would recommend setting the sync before starting playback; if the stream is very short, setting the sync afterwards may be too late.

Quote from: EEhIt possible to get sound output breaks when WiFi and Bluetooth are turned on at one time.

I suppose, it happens because of playback BASS thread is displaced by threads with higher priority (like WiFi and Bluetooth threads as in our case). Device buffer size increasing (BASS_CONFIG_DEV_BUFFER) does not solve proplem. Also, I was trying to turn off auto-updates in BASS and make my own updates (BASS_ChannelUpdate, BASS_Update) from thread with higher priority value than BASS uses (I set windows ce priority to 128), but sound breaks are still audible.

How can I control and change BASS playback thread priority value? Is it possible to make new config option (BASS_SetConfig)?

It looks like the device output thread (which mixes the buffers and feeds the device) would be left at default priority when it was intended to be at "time critical". An updated DLL to correct that is in the package now (see 1st post). Let me know if you still have the problem with it, and if so, I'll look into using an even higher priority.

EEh

QuoteIt looks like the device output thread (which mixes the buffers and feeds the device) would be left at default priority when it was intended to be at "time critical". An updated DLL to correct that is in the package now (see 1st post). Let me know if you still have the problem with it, and if so, I'll look into using an even higher priority.

Hi Ian,

I have tested new updated dll - sound breaks are still exist  (approx. 30 breaks during 10 minutes of playback) :(. Furthermore, I discover a new problem - sometimes sound output does not actually started after BASS_ChannelPlay is called. I.e. after succesfuly called BASS_ChannelPlay() there is no realy playback happens and BASS_ChannelIsActive returns 0. Such behaviour of BASS_ChannelPlay() is new (with earler bass.dll it works fine)- possible it's a bug.

Ian @ un4seen

Quote from: EEhI have tested new updated dll - sound breaks are still exist  (approx. 30 breaks during 10 minutes of playback)

Do either of the BASS_CONFIG_BUFFER and BASS_CONFIG_DEV_BUFFER settings make any difference with the updated DLL?

Do you happen to know what priority the WiFi/Bluetooth threads on your device are running at? Perhaps the problem is that they are running at a higher priority than the audio driver? Do you get the breaks in playback with any other software? If you haven't already done so, please also try to reproduce the problem with the pre-compiled examples.

Quote from: EEhFurthermore, I discover a new problem - sometimes sound output does not actually started after BASS_ChannelPlay is called. I.e. after succesfuly called BASS_ChannelPlay() there is no realy playback happens and BASS_ChannelIsActive returns 0. Such behaviour of BASS_ChannelPlay() is new (with earler bass.dll it works fine)- possible it's a bug.

That's strange, as the only change in the update was the thread priority, which shouldn't affect that stuff. Is there any pattern to the problem, eg. a particular file or length of file? Also, is the BASS_ChannelPlay call always successful, ie. returning TRUE?

If you could create a small example to reproduce the problem with, that would be most useful.

simon.chen

Quote from: Ian @ un4seen
Quote from: simon.cheni use BASS_ChannelSetSync method to do something when Play to End. but my SYNCPROC was not called.

private SYNCPROC _mySyncProc;
...
_mySyncProc = new SYNCPROC(MySync);
musicHandle = Bass.BASS_StreamCreateFile(this.mp3FilePath + this.mp3FileName, 0, 0, 0);
if (musicHandle != 0)
{
    if (Bass.BASS_ChannelPlay(musicHandle, true))
   {
         Bass.BASS_ChannelSetSync(musicHandle, BASSSync.BASS_SYNC_END | BASSSync.BASS_SYNC_ONETIME, 0, _mySyncProc, IntPtr.Zero);
    }
}

private void MySync(int syncHandle, int channel, int data, IntPtr user)
{
     ....//
}

and, when it stop itself at the pos 34185544(Total is 34246656), not the end. not only one mp3 file, but also all my mp3 file is stoped at nearly the end, but not the end. so my SYNCPROC cannot be called. Is there any wrong?

I tested setting an END sync just now, and it was fine. It shouldn't be file-specific, but if you like, you can upload a troublesome file to try here...

   ftp.un4seen.com/incoming/

Btw, I would recommend setting the sync before starting playback; if the stream is very short, setting the sync afterwards may be too late.
[/quote]

it was fine to get a END sync, but in the MySync, if i do some UI update, the Procedure Losing Control(debug step by step, but the process state turn into running state and not extcute the next statement), so i use the Invoke() method to do UI update, it work fine now.

radio42

Yes, that is totally normal.
The SYNCPROC will always execute in a thread created by BASS and not in your UI thread.
But any UI updates must be executed in the main UI thread...so you need to call Invoke/BeginInvoke in order to ensure you are back on the UI thread.

Bergamin

Hi,

When I run the following command line with the BassNet.Compact :
BassEnc.BASS_Encode_Start(streamRec, "output.wav", BASSEncode.BASS_ENCODE_PCM, null, IntPtr.Zero);Return a message :
This application requires a newer version of the Microsoft® .NET Compact Framework than the version installed on this device.


radio42

Yep, that indicated, that you have only the .Net compact framework 1.1 installed on the device.
But BASS.Net compact requires the .Net compact framework 2.0 to be installed ;-)