BASS for Universal Windows Platform (UWP)

Started by Ian @ un4seen,

Ian @ un4seen

That depends on whether you're using the BASSHLS add-on :) ... It was updated to the latest version.


Ian @ un4seen

The Windows Store version of the BASS 2.4.13 release is now up in the 1st post.

fxfletch

Hi,

I am just starting a new project that is a Windows Universal App, I have downloaded all the latest stuff to use with the store and am trying a simple test:

if (Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero))
            {
                // create a stream channel from a file
                int stream = Bass.BASS_StreamCreateFile("c:\\test.wav", 0, 0, BASSFlag.BASS_DEFAULT);
                if (stream != 0)
                {
                    // play the stream channel
                    Bass.BASS_ChannelPlay(stream, false);
                }
                else
                {
                    // error creating the stream
                    Debug.WriteLine ("Stream error: {0}", Bass.BASS_ErrorGetCode());
                }
            }

This exceptions on the stream create file method with:
System.Runtime.InteropServices.SEHException: 'External component has thrown an exception.'

Should it work with a Universal app?
Anything stupid I am doing wrong?

Ian

Ian @ un4seen

I don't think it is allowed for Windows Store apps to access the root C:\ folder. I get a Platform::AccessDeniedException when trying that here. Try putting the WAV file in your user "Music" folder (eg. "C:\Users\<username>\Music\") and playing it from there.

fxfletch

#180
Thanks for the reply, I think its throwing the error before it even try's to access the file because I have tried moving it to different locations and also giving it a name that doesn't exist.
I always get this exception never any of the bass errors that I would expect if the file couldn't be found.

System.Runtime.InteropServices.SEHException occurred
  HResult=0x80004005
  Message=External component has thrown an exception.
  Source=<Cannot evaluate the exception source>
  StackTrace:
<Cannot evaluate the exception stack trace>

If I modify the code as below the first stream create all works its only when I try and create from a file that this happens.

                int stream1 = Bass.BASS_StreamCreate(44100,2, BASSFlag.BASS_SAMPLE_FLOAT, new BASSStreamProc()); // WORKS OKAY
                // create a stream channel from a file
                int stream = Bass.BASS_StreamCreateFile("C:\\Users\\Ian\\Music\\test.wav", 0, 0, BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_SAMPLE_FLOAT); // EXCEPTION
                if (stream != 0)
                {
                    // play the stream channel
                    Bass.BASS_ChannelPlay(stream, false);
                }
                else
                {
                    // error creating the stream
                    Debug.WriteLine ("Stream error: {0}", Bass.BASS_ErrorGetCode());
                }

Ian

fxfletch

After hours of messing about I discovered that it works if I run it in a task, so my function to play a file and return the stream ID now looks like this:
public int PlayFile(string file)
        {
            int stream = -1;
            Task.Run(() =>
            {
                stream = Bass.BASS_StreamCreateFile(file, 0, 0, BASSFlag.BASS_DEFAULT);
                if (stream != 0)
                {
                    // play the stream channel
                    Bass.BASS_ChannelPlay(stream, false);
                }
                else
                {
                    // error creating the stream
                    Debug.WriteLine("Stream error: {0}", Bass.BASS_ErrorGetCode());
                }
            }).Wait();
            return stream;
        }

This works perfectly, note this is a windows universal app.

Ian @ un4seen

Oh, right. BASS_StreamCreateFile/URL calls do indeed need to be made asynchronously (not in the main thread) on Windows Store, as noted in the first post :)

Ian @ un4seen

The Windows Store versions of the BASS 2.4.13.8 and BASSHLS 2.4.1.1 releases are now up in the 1st post.

fxfletch

Hi,

Am I correct in thinking that ASIO is not available on a Windows Store app yet I am using bass.net and can't see any of the namespaces?

Ian

Ian @ un4seen

Yes, that is correct. I'm not sure it's possible to access ASIO drivers in Windows Store apps. Have you seen any Windows Store apps using ASIO?


Ian @ un4seen

I believe that app is actually using BASSASIO, and is using normal Windows APIs (Win32) rather than Windows Store APIs (Universal Windows Platform).

fxfletch

Ah so I might be misunderstanding something about the windows store version of the APIs. I thought I had to use those in order to be able to submit an app to the store. But that's obviously not the case.

Is this more about the fact that I am developing a UWP app? I thought I had no choice if I wanted to submit to the store, but perhaps I need to do a bit more research.

Ian

Ian @ un4seen

Yeah, with all the different names/changes, it's a bit confusing. I think what was once called a "Windows Store app" is now a "Universal Windows Platform app". But then there are Windows 8 and Windows Phone 8 apps, which aren't UWP, so who knows :)

Anyway, Win32 apps can now be packaged in a way for Windows Store, using this:

   https://docs.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-run-desktop-app-converter

fxfletch

Thanks,

Yes I was looking at that but unfortunately I am taking advantage of some of the UWP features that wouldn't be available if I did that. Basically the only reason I wanted to use ASIO is to access the additional output channels available on professional sound cards. I think I will have to recommend that any customers that want to do that use an external driver that can expose a multi channel ASIO device as virtual sound cards.

Ian


Ehsan

Hello.

I'm using BASS in a Windows Phone 8.1 project in a background task.

BASS Initialization:
Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero);

Stream creation:
_bassHandle = Bass.BASS_StreamCreateFile(_filePath, 0, (long)_fileSize,  BASSFlag.BASS_STREAM_DECODE);
(also tried with BASSFlag.BASS_STREAM_8BITS)


Media Source creation:

...
_info = Bass.BASS_ChannelGetInfo(_bassHandle);
unit bits  = 16;
If (_info.Is32bit){ bits = 32;} else If (_info.Is8bit) { bits = 8;}

AudioEncodingProperties pcmprops  = AudioEncodingProperties.CreatePcm((uint)_info.freq, (uint)_info.chans, bits)
_source = new MediaStreamSource(new AudioStreamDescriptor(pcmprops));


Creating samples:

byte[] buf = new byte[4096];
int decoded  = Bass.BASS_ChannelGetData(_bassHandle, buf, buf.Length);
double secs = Bass.BASS_ChannelBytes2Seconds(m_BassHandle, decoded);
MediaStreamSample sample = MediaStreamSample.CreateFromBuffer(buf.AsBuffer(), TimeSpan.FromSeconds(_currentPosition));
...



The problem is that sound quality is noticeably worse compared to Windows Phone's own MediaPlayer object. There is a noticeable wheezing sound around singer's voice in multiple mp3 files I listened to, and that's just what I can hear.

Is there a catch here? What am I missing?

Ian @ un4seen

From the use of the BASS_STREAM_DECODE flag, it looks like you are only using BASS for decoding of the MP3 file, not playback of it. Is that correct? If so, do you hear the same problem if you try having BASS handle playback too, by removing the BASS_STREAM_DECODE flag and calling BASS_ChannelPlay? Please also confirm what BASS version is being used by calling BASS_GetVersion.

Ehsan

Yes, I am decoding the file and supplying it to WinRT through MediaStreamSource.SampleRequested() event handler, invoked when the framework requires a sample, which is the mechanism compatible with WinRT's BackgroundMediaPlayer.

So as you suggested I used:
_bassHandle = Bass.BASS_StreamCreateFile(_filePath, 0, (long)_fileSize, BASSFlag.BASS_DEFAULT);

And then called:
Bass.BASS_ChannelPlay(_bassHandle, false);

To play the channel, same result: the song is played, but there is a wheezing noise around relatively high human voices.

BASS_GetVersion returns 33819916.

Ehsan

I may be able to help detect the issue if needed, I can create a Windows Phone sample project using both the built in player and BASS, with a sample mp3 so you can hear the difference if you need.
I'll be glad to help debug the problem if it solves the issue as my project depends on this library now. Let me know.

Ian @ un4seen

The problem you're having sounds a lot like the one reported in this thread:

   www.un4seen.com/forum/?topic=18044

If so, the BASS 2.4.13.13 update in the first post should fix it. You're currently using 2.4.13.12. Please re-download to get the latest version and see if you still have the problem then.

Ehsan

Hey Ian

Yes, that thread describes my problem perfectly.

I just checked, and I was using the latest version. I downloaded the library for the first time a few days ago, so it is unlikely I was using an outdated version.
Still, I downloaded the library again and referenced it, checked the bass.dll file's version (through the Windows properties dialog) and it indeed says 2.4.13.13. The problem still exists.

To be clear, I'm using the Windows Phone version and not the Windows 10 version of the library because my app is WinRT (targeting Windows Phone 8.1 and up) and not UWP. Are you sure the problem described in that thread was also fixed for the Windows Phone version of the bass.dll?

Ian @ un4seen

No, I didn't check the fix on Windows Phone. I will do that later today. The fix just involved a compiler update (no code changes), and I assumed it would fix the problem on all of the Windows Store platforms, but perhaps it didn't. In the meantime, can you try to reproduce the problem with the Windows 8 build (or Windows 10) too, to confirm whether the problem is only affecting the Windows Phone platform for you?

Ehsan

Sure thing, I'll test the Windows 8 and 10 versions to see if the issue is still there. Will be back in a bit.

Ehsan

I couldn't test the Windows 8 version because I was met with "could not find DLL 'bass': module not found" exception no matter what I did, but I can confirm the Windows 10 version plays smoothly on my laptop in a UWP app using BASS_PlayChannel, no problems there.

Hopefully you'll catch what it is that's affecting the Windows Phone version.