Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: IDirectSound8  (Прочитано 17672 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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)
{

В чём отличие ? Или что я забыл сделать?


* ALARM.WAV (56.8 Кб - загружено 753 раз.)
* АКБ-авария.wav (6.06 Кб - загружено 766 раз.)
* CWave.rar (2.6 Кб - загружено 770 раз.)
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 15-03-2011 20:11 » 

Леш, первый файлик - PCM 22 кГц моно 8 бит, второй - ADPCM 8 кГц моно 4 бита. Вопрос в кодеке. Перекодируй второй аналогично первому.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 16-03-2011 04:30 » 

Ром, перекодировать - это как ? Программно возможно ? По идее пользователь не должен думать об этом - он лишь знает, что можно загружать WAV файлы

или просто нужно как-то узнать нужный кодек и как-то его подключить, если он есть на машине ? А в винампе оба файла играются
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 16-03-2011 07:00 » 

Перекодировать - любым редактором звука.

Укажи, что WAV должны быть PCM. Ведь WAV - это контейнерный формат, а содержимое может быть в любом формате. Даже mpeg1/layer3 или в другом, еще более экзотичном.

Другой вариант - распознавать формат (пара байт в заголовке) и если он не 0, то запрашивать у системы кодек. На воспроизведение подается уже PCM.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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 » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 16-03-2011 07:40 » 

нашёл интересную на первый взгляд статью, позже почитаю. Пока тут для закладки ссылку оставлю
http://www.rsdn.ru/article/multimedia/winacm.xml
Записан

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 и не заморачиваться с кодированием.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 16-03-2011 08:57 » 

zubr, ух ты, щас попробую Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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(); до окончания работы с объектом?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 17-03-2011 08:42 » 

Ochkarik, попробовал - результат тот же самый

так ведь на загрузку URL он не ругается - S_OK там

Добавлено через 3 минуты и 22 секунды:
Кстати, что в батнике означает вот это место

cd %~dp0

и вот это

.../%%~nxA"

?

« Последнее редактирование: 17-03-2011 08:45 от Алексей1153 » Записан

Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 17-03-2011 09:11 » 

всё, вопрос снят, спасибо )
Записан

zubr
Гость
« Ответ #16 : 17-03-2011 11:05 » 

Алексей1153++, в дельфях у меня эта схема отлично работает, к mp3 я просто путь неправильный указал. Проверять в VC++ нема часу.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 17-03-2011 11:19 » new

эхъ...
ну я пока отдал пользователям с DS8, с инструкцией по конвертации. А то жаждут )
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines