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

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

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

« : 09-08-2010 02:25 » 

Доброго всем времени всем. Пишу программу для записи звука с устройства записи на DirectSound. Имею на вооружении только DirectSound документцию. Впрограмме возникают пролемы с инициализацией определенных объектов, но есть сметные моменты и ранее, возможно они и привели к ошибкам позже.

Необходимо сформировать список доступных устройств захвата. Реализация:

   //Объявляю CALLBACK функцию

Код:
BOOL CALLBACK EnumCallback (
    LPGUID GUID,
    LPCSTR Description,
    LPCSTR Module,
    VOID *Context
 )
{
std::ofstream FileLog_Dll("c:\\Progon.log",std::ios::app);
std::cout<<"Enumerate is done"<<std::endl;
FileLog_Dll<<GUID<<std::endl<<"--------"<<std::endl;
Sleep(100);
FileLog_Dll.close();
return true;

};

//Далее после main(){

Код:
DWORD dError;
HRESULT hresult;

if ((hresult=DirectSoundCaptureEnumerate (
   (LPDSENUMCALLBACKW)EnumCallback,
   NULL))!=NULL)
{
    std::cout<<"Error of enumerate devices"<<std::endl;
dError=GetLastError();
std::cout<<dError<<std::endl;
};

GUID в фай заносятся, а вот как мне сделать чтобы я мог ими в програме оперрировать, какого типа массив (или переменную) создать и запись в него осуществить? Может кто работал с Direct'ом?
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #1 : 09-08-2010 03:53 » 

если через указатель VOID *Context разрешено передавать что угодно, передай туда указатель на объект - получатель списка. Внутри  EnumCallback  получишь доступ к нему и заполнишь что нужно Улыбаюсь А не только файл
Записан

Денисrf
Постоялец

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

« Ответ #2 : 10-08-2010 06:09 » 

Да согласен, не внимательно прочитал сори ))) И спасибо!
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
Денисrf
Постоялец

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

« Ответ #3 : 11-08-2010 11:40 » 

А вот еще, не устраните мою неуверенность в отношеннии переменной:

Код:
GUID *guid;

    BOOL CALLBACK EnumCallback (
    LPGUID GUID,
    LPCSTR Description,
    LPCSTR Module,
    VOID *Context
 )
{
int count=0;
if (guid!=GUID) count++;
guid=GUID;                        //Вот это присвоение вызывает подозрение
return true;

};

Когда я присваиваю  (предварительно передаю guid в DirectSoundCaptureEnumerate)

Код:
guid=GUID; 


Далеепросматриваю значение этой переменной и получатся: 00000000
                                                                                         00902270
Это реальные GUID моих устройств? А то у меня подозрения что я что-то с типами напуал. Значения всегда одни и теже. Может вопрос глупый, но очень мешает. Спасибо.
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
Вад
Модератор

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

« Ответ #4 : 11-08-2010 12:28 » 

GUID (тип, не переменная) - это структура. То, что у тебя в guid - это лишь указатель на эту структуру. Соответственно, 0 - это инициализированный нулём (нулевой) указатель, а второе число - тоже указатель, но уже ненулевой. Чтобы смотреть GUID, надо указатели разыменовывать и выводить содержимое структуры. Формат самого GUID обычно выглядит так: 6B29FC40-CA47-1067-B31D-00DD010662DA (пример из MSDN) - то есть, выводится 16-ричное представление всех полей структуры.
« Последнее редактирование: 11-08-2010 12:31 от Вад » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #5 : 11-08-2010 14:16 » 

Цитата
guid=GUID;                        //Вот это присвоение вызывает подозрение
у меня тоже, кстати )) Потому что не люблю глобальные переменные ))
Записан

Денисrf
Постоялец

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

« Ответ #6 : 12-08-2010 09:50 » 

Да спасибо, я именно это и подозревал.
Вот так вроде испавил:

Код:
#include "Rpcdce.h"
LPGUID lpguid;

   BOOL CALLBACK EnumCallback (
    LPGUID GUID,
    LPCSTR Description,
    LPCSTR Module,
    VOID *Context
 )
{
lpguid=GUID;
return true;

};
std::cout<<lpguid->Data1<<"-"<<lpguid->Data2<<"-"<<lpguid->Data3<<"-"<<(DWORD)lpguid->Data4<<std::endl;
   
Теперь значение:  3178092315-15851-4561-9446008

Похлже на правду? ))
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
Джон
просто
Администратор

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

« Ответ #7 : 12-08-2010 10:40 » 

Денисrf, ты вобще-то читаешь, что тебе пишут?

GUID (тип, не переменная) - это структура.

Так что у тебя тогда означает LPGUID GUID?

Очень нехорошо давать имена переменным совпадающие с названием типа, в пределе код перестаёт быть читаемым:

int double = 1;
double int = double;

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Денисrf
Постоялец

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

« Ответ #8 : 12-08-2010 10:48 » 

Ммм ну впринципе да. Спасибо за замечание.
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
Вад
Модератор

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

« Ответ #9 : 12-08-2010 12:55 » 

Похлже на правду? ))
В дополнение сказанному Джоном, добавь std::hex:
Код:
std::cout << std::hex << lpguid->Data1<<"-"<<lpguid->Data2<<"-"<<lpguid->Data3<<"-"<<(DWORD)lpguid->Data4<<std::endl;
всё-таки, GUID в 16-ричном формате обычно везде выводится.
Записан
Денисrf
Постоялец

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

« Ответ #10 : 13-08-2010 03:39 » 

Спасибо, да так удобнее. А вот еще делеммка, если я вот так создам объект устройства, мне ведь его инициализация (g_pDSDefault->Initialize(lpguid)) не нужна?

Код:
LPDIRECTSOUNDCAPTURE       g_pDS            = NULL;

if FAILED(hresult=DirectSoundCaptureCreate (
    lpguid,
    &g_pDS,
    NULL
))
{
std::cout<<"Error of create DSC'Object"<<std::endl;
dError=GetLastError();
std::cout<<dError<<std::endl;
}
else std::cout<<"Create DSC'Object"<<std::endl;
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
Денисrf
Постоялец

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

« Ответ #11 : 14-08-2010 00:34 » 

Да, при использовании функции DirectSoundCaptureCreate, задействование функции Initialize не требуется. Только если создавался не инициализированный объект а его заготовка стандартным для COM методом CoCreateInstance.
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
Денисrf
Постоялец

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

« Ответ #12 : 14-08-2010 05:31 » 

Товарищи, моя самая пока что жесть-ошибка. Процедура создания буфера захвата всегда завершается ошибкой. пробовал и к устройству по умолчаню (с GUID = NULL) и к устройству с полученым lpguid. Функцию WAVEFORMATEX правда заполнял из книжки примером, проверил только количество каналов, их оазалось 2.

Код:
WAVEFORMATEX                     wfx;
LPDIRECTSOUNDCAPTURE       g_pDSDefault            = NULL;
LPDIRECTSOUNDCAPTUREBUFFER  g_pDSb           = NULL;
.
.
.
if FAILED(hresult=DirectSoundCaptureCreate (                    //ЗАВЕРШАЕТСЯ БЕЗ ОШИБКИ, КАК И СОЗДАНИЕ ОБЪЕКТА С ПОЛУЧЕННЫМ guid
    NULL,
    &g_pDSDefault,
    NULL
))
{
std::cout<<"Error of create DSC'Default Object"<<std::endl;
dError=GetLastError();
std::cout<<dError<<std::endl;
}
else std::cout<<"Create DSC'Default Object"<<std::endl;
...

ZeroMemory(&wfx, sizeof(WAVEFORMATEX));
wfx.cbSize                   =0;
wfx.wFormatTag            =WAVE_FORMAT_PCM;
wfx.nSamplesPerSec      =44100;
wfx.nAvgBytesPerSec      =4410*4;
wfx.nBlockAlign              =4;
wfx.wBitsPerSample       =16;
wfx.nChannels               =2;


DSCBUFFERDESC              DSdCBuffer,*bufferdesc;
ZeroMemory( &DSdCBuffer, sizeof(DSCBUFFERDESC) );
DSdCBuffer.dwSize =sizeof(DSCBUFFERDESC);
DSdCBuffer.dwFlags =0;
DSdCBuffer.dwBufferBytes            =64*1024;
DSdCBuffer.dwReserved                =0;
DSdCBuffer.lpwfxFormat           =&wfx;

if (DS_OK!=g_pDSDefault->CreateCaptureBuffer(&DSdCBuffer,&g_pDSb,0))
std::cout<<"Error Capture Buffer creating: "<<std::endl;

Код конечно большой, извиняюсь. Не могу понять в чем ошибка. Может ли быть, что у меня на компе верси DirectSound меньше чем 5 версии? И как бы вообще версию узнать. Буфер и объект устройства воспроизведения создается без ошибок.
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
Phodopus
Интересующийся

ru
Offline Offline

« Ответ #13 : 17-08-2010 12:29 » 

wfx.cbSize =0;
это зря
Записан
Денисrf
Постоялец

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

« Ответ #14 : 18-08-2010 04:48 » 

wfx.cbSize          =sizeof(wfx); Сделал так. Результат тот же. До сих пор не пойму в чем дело.
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
Денисrf
Постоялец

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

« Ответ #15 : 02-10-2010 16:05 » 

Извините, но опять подниму эту тему. Пееписываю программу, теперь решил сделать так (это получение информации о всех устроствах записи):

Код:
#include "stdafx.h"
#include "conio.h"
#include "windows.h"
#include  <dsound.h>
#include "setupapi.h"
#include "iostream"
#include <tchar.h>
#include "fstream"
#include "string.h"
#pragma comment(lib,"setupapi.lib")

HRESULT hError;
DWORD dError;

struct EnumInfo
{
std::string m_sDrivInfo;
LPGUID ms_lpGuids[20];
int m_iDiviceCount;

};

BOOL CALLBACK EnumCallback
(
    LPGUID lpGuid,
    LPCSTR lpcstrDescription,
    LPCSTR lpcstrModule,
    EnumInfo *pEnumInfo
)
{
pEnumInfo->m_sDrivInfo=std::string(lpcstrDescription);                       //МОЖЕТ СДЕСЬ ОШИБКА?
pEnumInfo->ms_lpGuids[pEnumInfo->m_iDiviceCount++]=lpGuid;
return pEnumInfo->m_iDiviceCount<20;
};
int _tmain(int argc, _TCHAR* argv[]) //*pEnumInfo
{
EnumInfo EnumList;
ZeroMemory( &EnumList, sizeof(EnumInfo) );

DirectSoundCaptureEnumerate((LPDSENUMCALLBACK) EnumCallback, &EnumList);

          std::cout<<"Divece detecting results:"<<"\n"<<EnumList.m_iDiviceCount;
          std::cout<<"Divece Description:"<<"\n"<<EnumList.m_sDrivInfo;                                                //НЕ КОМПИЛИТСЯ.
         


 
Записан

Your password is personal - do not share it with anyone and make sure it is not easy to crack.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines