Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 15-03-2011 12:48 » |
|
Столкнулся с такой проблемой: в аттаче два файлика. Тот, что ALARM.WAV – его удаётся проиграть при помощи DirectSound8, а тот, что АКБ-авария.wav – ну никак не желает код класса приложен спотык происходит вот здесь: bool CWave::OpenSoundData(const BYTE* pFile_,const DWORD dwdFileLen_) { ... ... DWORD dwdRes=m_p_spec_body->pDS8->CreateSoundBuffer ( &m_p_spec_body->BufDesc ,&pDirSBuf_ ,0 );
//DS_OK!=dwdRes <<<<<<<<<<<<
if(DS_OK==dwdRes) { В чём отличие ? Или что я забыл сделать?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 15-03-2011 20:11 » |
|
Леш, первый файлик - PCM 22 кГц моно 8 бит, второй - ADPCM 8 кГц моно 4 бита. Вопрос в кодеке. Перекодируй второй аналогично первому.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #2 : 16-03-2011 04:30 » |
|
Ром, перекодировать - это как ? Программно возможно ? По идее пользователь не должен думать об этом - он лишь знает, что можно загружать WAV файлы
или просто нужно как-то узнать нужный кодек и как-то его подключить, если он есть на машине ? А в винампе оба файла играются
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #3 : 16-03-2011 07:00 » |
|
Перекодировать - любым редактором звука.
Укажи, что WAV должны быть PCM. Ведь WAV - это контейнерный формат, а содержимое может быть в любом формате. Даже mpeg1/layer3 или в другом, еще более экзотичном.
Другой вариант - распознавать формат (пара байт в заголовке) и если он не 0, то запрашивать у системы кодек. На воспроизведение подается уже PCM.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 16-03-2011 07:36 » |
|
вот мне подсказали утилитку. http://sox.sourceforge.net/Переконвертировал, подправив приложенный там пример так cd %~dp0 mkdir converted FOR %%A IN (%*) DO sox %%A -b 8 -e signed-integer "converted/%%~nxA"
напишу юзерам инструкцию ) Добавлено через 40 секунд:Другой вариант - распознавать формат (пара байт в заголовке) и если он не 0, то запрашивать у системы кодек. На воспроизведение подается уже PCM.
а как запрашивать кодек у системы ?
|
|
« Последнее редактирование: 16-03-2011 07:37 от Алексей1153 »
|
Записан
|
|
|
|
|
zubr
Гость
|
|
« Ответ #6 : 16-03-2011 08:51 » |
|
Алексей1153++, как я понимаю, тебе надо просто проиграть звуковой файл. Если это так, то зачем заморачиваться с DirectX. Я бы в данном случае использовал уже готовое решение от Microsoft - интерфейс IWMPPlayer4. Алгоритм: 1. Создать объект IWMPPlayer4 2. Установить его свойство URL = путь к проигрываемому файлу 3. Получить объект IWMPControls, который является свойством Controls объекта IWMPPlayer4 4. Вызвать метод IWMPControls::play 5. Если надо - вызвать IWMPControls::stop В этом случае ты можешь проигрывать любой доступный в системе медиа-формат, а не только waw и не заморачиваться с кодированием.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 16-03-2011 08:57 » |
|
zubr, ух ты, щас попробую
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 16-03-2011 09:57 » |
|
поскрёб по тырнетц и МСДН, попробовал, что-то не очень неудачно код получился такой: (код) IWMPPlayer4* player4=0; IWMPControls* Cont=0; IWMPPlayer* player=0; HRESULT hr;
hr = CoCreateInstance( __uuidof(WindowsMediaPlayer) ,0 ,CLSCTX_INPROC_SERVER ,__uuidof(IWMPPlayer) ,(void **)&player );
if(hr==S_OK) { const GUID IID_IWMPPlayer4={0x6C497D62,0x8919,0x413c,0x82,0xDB,0xE9,0x35,0xFB,0x3E,0xC5,0x84};
hr=player->QueryInterface(IID_IWMPPlayer4,(void**)&player4);
if(hr==S_OK) { hr=player4->get_controls(&Cont); player->Release();
if(hr==S_OK) { hr=player4->put_URL(L"C:\\ALARM.WAV");
hr=Cont->play();//<< hr==0x000d1105 }
} }
if(Cont)Cont->Release(); if(player4)player4->Release();
при вызове play() получаю ошибку 0x000d1105 , что из таблички ниже расшифровал как FACILITY_MEDIASERVER ERROR_PARTITION_FAILURE (табличка) // // Values are 32 bit values laid out as follows: // // 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 // +---+-+-+-----------------------+-------------------------------+ // |Sev|C|R| Facility | Code | // +---+-+-+-----------------------+-------------------------------+ // // where // // Sev - is the severity code // // 00 - Success // 01 - Informational // 10 - Warning // 11 - Error // // C - is the Customer code flag // // R - is a reserved bit // // Facility - is the facility code // // Code - is the facility's status code
что я не так делаю?
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #9 : 16-03-2011 10:18 » |
|
А зачем ты делаешь player->Release(); до окончания работы с объектом?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 16-03-2011 10:20 » |
|
zubr, я освобождаю промежуточный интерфейс - он больше не требуется после получения №4. Но даже если не закрывать его сразу - результат такой же, не играет
Добавлено через 1 минуту и 22 секунды: а ещё - умеет ли IWMPPlayer4 играть не из файла, а из массива в памяти ?
|
|
« Последнее редактирование: 16-03-2011 10:21 от Алексей1153 »
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #11 : 16-03-2011 11:15 » |
|
Странно, у меня авишку играет, mp3 не хочет
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #12 : 16-03-2011 16:26 » |
|
Алексей1153++, HRESULT put_URL( [in] BSTR bstrURL ); - такой? BSTR MyBstr = L"I am not happy BSTR";BSTR MyBstr = SysAllocString(L"I am a happy BSTR");
|
|
« Последнее редактирование: 16-03-2011 16:29 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 17-03-2011 08:42 » |
|
Ochkarik, попробовал - результат тот же самый
так ведь на загрузку URL он не ругается - S_OK там
Добавлено через 3 минуты и 22 секунды: Кстати, что в батнике означает вот это место
cd %~dp0
и вот это
.../%%~nxA"
?
|
|
« Последнее редактирование: 17-03-2011 08:45 от Алексей1153 »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #14 : 17-03-2011 09:00 » |
|
вот тут поищи http://www.robvanderwoude.com/for.php%A vs. %%A %A is for use on command lines only. In all examples and syntax lines shown %A should be substituted with %%A when used in batch files. http://www.robvanderwoude.com/ntfor.php#FOR_F%~nxi - expands %i to a file name and extension only %~dpi - expands %i to a drive letter and path only
|
|
« Последнее редактирование: 17-03-2011 09:05 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 17-03-2011 09:11 » |
|
всё, вопрос снят, спасибо )
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #16 : 17-03-2011 11:05 » |
|
Алексей1153++, в дельфях у меня эта схема отлично работает, к mp3 я просто путь неправильный указал. Проверять в VC++ нема часу.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 17-03-2011 11:19 » |
|
эхъ... ну я пока отдал пользователям с DS8, с инструкцией по конвертации. А то жаждут )
|
|
|
Записан
|
|
|
|
|