Благодаря помощи Google я создал программу, которая воспроизводит музыку в моем музыкальном каталоге и поддерживает пробелы. Однако я не хочу продолжать жестко кодировать названия песен, поэтому мне интересно, могу ли я заменить имя файла на переменную и std :: cin, когда моя программа запущена. Тем не мение, Я также хочу иметь возможность играть песни, в названиях которых есть пробелы. Я сделал функцию-обертку (я думаю, что это будет считаться как единица?) Для mciSendString, и я пытаюсь передать ей параметр «name» для воспроизведения. Однако из-за сложностей с LPCWSTR и std :: string, между прочим, у меня возникают трудности с реализацией этого.
Вот моя текущая музыкальная функция:
void Music(std::string strSongName,DWORD dwExtraFlag)
{
MCIERROR me =
mciSendString(TEXT("open \"D:\\Windows.old\\Users\\MyName\\Desktop\\Sounds\\Music\\song name.mp3\""" type mpegvideo alias song1"),
NULL, 0, 0);
/*
note that I want to be able to play songs
with spaces in their name
*/
if (me == 0)
{
me = mciSendString(TEXT("play song1 wait repeat"), NULL, 0, 0);
mciSendString(TEXT("close song1"), NULL, 0, 0);
}
}
На что я хочу, чтобы это было похоже:
void Music(std::string strName,DWORD dwExtraFlag)
{
MCIERROR me =
mciSendString(TEXT("open \"D:\\Windows.old\\Users\\MyName\\Desktop\\Sounds\\Music\\STRNAMEVARIABLEHERE.mp3\""" type mpegvideo alias song1"),
NULL, 0, 0);
/*
note that I want to be able to play songs
with spaces in their name
*/
if (me == 0)
{
me = mciSendString(TEXT("play song1 wait repeat"), NULL, 0, 0);
mciSendString(TEXT("close song1"), NULL, 0, 0);
}
}
Затем я сделал бы переменную в main или какой-нибудь другой функции и вставил бы std :: cin в эту переменную.
std::string strNameOfSong = "";
std::cin >> strNameOfSong;
Тогда я бы назвал музыку как:
Music(strNameOfSong,0)
Я также хотел бы отметить, что вы можете игнорировать аргумент «dwExtraFlags», если вы хотите, это то, что мне еще предстоит реализовать.
В любом случае, я был бы очень признателен за помощь в реализации этого, поскольку я новичок в C ++. Однако я не хочу оставлять этот проект незавершенным и хочу завершить его, прежде чем двигаться дальше.
Буду очень признателен за любые решения, помощь или советы. Если вы хотите, чтобы я был более конкретным или предоставил дополнительную информацию, чтобы помочь вам сформулировать ответ, я был бы рад сделать это.
Большое спасибо.
РЕДАКТИРОВАТЬ: Я выполнил предложение Итана. После добавления некоторых вещей и добавления его предложения моя программа перестает работать вскоре после ввода названия песни, которую я хочу. Я попытался отладки, и он сообщает:
«Исключение, выброшенное в 0x00047430 в Program.exe: 0xC0000005: расположение записи нарушения доступа 0x6563696E.»
Вот что я добавил в свою основную функцию (кроме предложения Этана):
static std::string strSongName = "";
std::cin >> strSongName;
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&Music, &strSongName, 0, 0);
// The above is to createthread so I can play music while doing other things
Отладка, значения кажутся правильными. Однако я внезапно получаю это исключение, и приложение перестает работать. Как я могу иметь нарушение прав доступа?
Еще одно небольшое изменение, которое я внес в предложение Этана:
MCIERROR me =
mciSendString((LPCWSTR)(songFile.c_str()), NULL, 0, 0);
(Я набрал текстовый файл SongFile, поскольку он выдавал мне ошибки)
Я также изменил пример пути назад к нормальному.
EDIT2:
Исправлено исключение! Это потому, что я (глупым образом) забыл разыменовать указатель на «strSongName». Однако, похоже, что после пробела все еще не распознано, как я его отлаживал. Кроме того, кажется, что песни не воспроизводятся, даже если у них нет пробела, и да, я тоже добавляю .mp3.
Как насчет этого?
void Music(std::string strName,DWORD dwExtraFlag)
{
std::string songFile = "open \"D:\\Windows.old\\Users\\MyName\\Desktop\\Sounds\\Music\\";
songFile += strName + "\" type mpegvideo alias song1";
MCIERROR me =
mciSendString(songFile.c_str(), NULL, 0, 0);
/*
note that I want to be able to play songs
with spaces in their name
*/
if (me == 0)
{
me = mciSendString(TEXT("play song1 wait repeat"), NULL, 0, 0);
mciSendString(TEXT("close song1"), NULL, 0, 0);
}
}
Других решений пока нет …