Reputation: 786
MCIERR_INTERNALI am trying to make a simple Media player inside an app, but I've noticed that my code WILL NOT play music unless the file is a low bitrate around 192kbps or less. The issue is that most of my music is around 260-320kbps.
Here's my code, if there's something I can do to up the 'available' bitrate options let me know, otherwise I'll need a new DLL suggestion please!
class MusicPlayer
{
[DllImport("winmm.dll")]
private static extern long mciSendString(string lpstrCommand, StringBuilder lpstrReturnString, int uReturnLength, int hwndCallback);
private static void checkMCIResult(long code)
{
int err = (int)(code & 0xffffffff);
if (err != 0)
{
throw new Exception(string.Format("MCI error {0}", err));
}
}
public void open(string file)
{
string command = "open \"" + file + "\" type MPEGVideo alias MyMp3";
checkMCIResult(mciSendString(command, null, 0, 0));
}
public void play()
{
string command = "play MyMp3";
mciSendString(command, null, 0, 0);
}
public void pause()
{
string command = "stop MyMp3";
mciSendString(command, null, 0, 0);
}
}
**EDIT: -Winform application
-using Windows 7 sp1
-Using Visulal Studio 2013 community edition
-From error catching I now see the error number is 289, -256 = 22: MCIERR_INTERNAL, not sure what that's all about
Upvotes: 4
Views: 1776
Reputation: 69706
A typical problem with Windows API playing or not playing specific MP3 files is the following. One of the standard MP3 reading/parsing components has a [presumably?, I am under impression 16KB is in question] fixed size buffer to read initially, then skip tags and get to the real bitstream. With a lot of tags, the parser is unable to read the data and rejects the file as non-playable.
When played through DirectShow (for C# code, this would typically be playback through DirectShow.NET open source library), it is suggested to use another stock Windows component capable to read MP3 files, which is free from tag problem: Windows Media ASF Reader filter.
See related:
Even though it's a long standing issue, Microsoft years ago decided to not update standard MPEG-1 stream splitter and the problem basically exists in all Windows versions.
Upvotes: 0
Reputation: 786
Ok, so I figured this out (thanks to @Hans Passant), the error code I was recieving was 277, Turns out there are problems with MCI and mp3's which had a large ID3(v2.x) tag - Album art, lyrics etc.
Coincidentally the 2 files causing me the trouble had album art, and completely filled out ID3 data (including Lyrics). So I'll be switching over to some other audio library for my needs
Upvotes: 1
Reputation: 942040
This is not an inherent limitation in Windows, problems like these are environmental. A basic check-list:
A simple implementation of an error checker method:
private static void checkMCIResult(long code) {
int err = (int)(code & 0xffffffff);
if (err != 0) {
throw new Exception(string.Format("MCI error {0}", err));
}
}
Usage:
public static void open(string file) {
string command = "open \"" + file + "\" type MPEGVideo alias MyMp3";
checkMCIResult(mciSendString(command, null, 0, 0));
}
There are a lot of possible MCI errors, you'll find them listed in MMSystem.h file in the Windows SDK "include" directory on your machine. Like C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\MMSystem.h. Start at MCIERR_INVALID_DEVICE_ID, subtract 256 from the error code. Always mention your Windows and VS version btw.
Upvotes: 6