Форум программистов, компьютерный форум, киберфорум
Программирование звука
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
1

Ошибка создания Device в DirectSound. Не видит namespace Device

24.11.2012, 19:44. Показов 2566. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
хочу в примитивной игрушке (сделанной не на Direct3D) добавить звуковое оформление через DirectSound.

1. Скачал и установил DirectX SDK 8 и 10 года.
2. прописал в хэдере где хочу использовать DirectSound подключение #include <dsound.h>
3. прописал связь с библеотекой #pragma comment(lib, "dsound.lib")

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <windows.h>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <math.h>
#include <pngimage.hpp>
#include <vector.h>
#include <list.h>
#include <IniFiles.hpp>
#include <ctime>
#include <stdio.h>
#include <stdlib.h>
#include "mmsystem.h"
#include <dsound.h>
 
#pragma comment(lib, "dsound.lib")
#pragma comment(lib, "winmm.lib")
 
HANDLE DataDLL = LoadLibrary("Data.dll");
 
#define GTB Graphics::TBitmap
 
  Microsoft.DirectX.DirectSound::Device dev;  //[BCC32 Error]  E2141 Declaration syntax error
Помогите решить проблему.
Использую CodeGear™ RAD Studio 2009 Version 12.0.3170
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2012, 19:44
Ответы с готовыми решениями:

Что означает ошибка device missing or unknow device (-24)?
Пытаюсь хотя бы считать данные с микроконтроллера через PonyProg. Выдает ошибку. Вроде все...

Ошибка: PSI devise listing Bus no. Device No/ Func/ No/ Vendor/Device class Devise
у меня такая проблемка. Есть комп. мать asus, проц. amd, видюха radeon. При включении компа...

Bad DirectSound driver. Please install proper drivers or select another device in configuration
Хотел послушать музыку МР3, но выдаётся сообщение DirectSound output v 2.47(d) error Bad...

Ошибка: Reboot and Select proper Boot device or Insert boot Media in selected Boot device and Pres a key. Надо исправить :(
Добрый день, я имею ноутбук, виндоус 7, вообщем резали диски программой акронис, все было норм,...

7
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
24.11.2012, 23:18 2
Цитата Сообщение от Deimon Посмотреть сообщение
хочу в примитивной игрушке (сделанной не на Direct3D) добавить звуковое оформление через DirectSound.
ИМХО, ради звука особого смысла в использовании DX нет.
Цитата Сообщение от Deimon Посмотреть сообщение
C++
1
Microsoft.DirectX.DirectSound::Device dev
Цитата Сообщение от Deimon Посмотреть сообщение
Использую CodeGear™ RAD Studio 2009 Version 12.0.3170
WTF??

Необходимо смотреть в строну интерфейсов (IDirectSound).
1
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
25.11.2012, 14:27  [ТС] 3
DefineTrueFalse, большого смысла нет и в самой затее, написать игру. Я приследую цель, просто освоить Direct Sound, для дальнейшего использования. Мне нужно одновременно воспроизводить какю-нибудь музыкальную композицию и звуки действий (а действий может быть много) Плодить Player'ы - не вариант.
Вот так вот - компилируется и ни на что не жалуется
C++
1
IDirectSound;
а так никак не видит объявления функции (не показывает подсказки)
C++
1
2
IDirectSound::CreateSoundBuffer();
IDirectSound.CreateSoundBuffer();
если так, то пишет туже ошибку: [BCC32 Error] E2040 Declaration terminated incorrectly
C++
1
2
3
4
      
  LPDIRECTSOUNDBUFFER pDSBPrimary = NULL;
  DSBUFFERDESC dsbd;
  IDirectSound.CreateSoundBuffer( &dsbd, &pDSBPrimary, NULL);
Как понять какое пространство имен нужно использовать (DirectSound, IDirectSound, DSound, DirectSound8, Microsoft.DirectX.DirectSound и т.д.) ??
Потому что я по книге пытаюсь разобраться , а там вот что написано (книнга по DirectX9). Есть ли зависимость от компилятора?

0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
25.11.2012, 16:22 4
Цитата Сообщение от Deimon Посмотреть сообщение
Плодить Player'ы - не вариант.
Кроме компонентов, входящих в поставку, существуют API методы. Так же для работы со звуком существует библиотека BASS (но это уже для справки).
Цитата Сообщение от Deimon Посмотреть сообщение
Как понять какое пространство имен нужно использовать?
Нужно не подставлять данные, а понимать "что и для чего". В ином случае - это не обучение. Разработчики в разных версиях библиотеки DirectX называют классы, методы и т.п. по разному. Допустим: D3DXCreateFont - из 9ой версии, а D3DX10CreateFont из 10ой.

Более того, название методов в объявлении, зависит от определения директив, т.е. в DX9 существует IDirectSound, но если используется ОС Windows XP SP2 или выше, то интерфейс объявляется как IDirectSound8:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#if (NTDDI_VERSION < NTDDI_WINXP) /* Windows 2000 */
#define DIRECTSOUND_VERSION 0x0700  /* Version 7.0 */
#elif (NTDDI_VERSION < NTDDI_WINXPSP2 || NTDDI_VERSION == NTDDI_WS03) /* Windows XP and SP1, or Windows Server 2003 */
#define DIRECTSOUND_VERSION 0x0800  /* Version 8.0 */
#else /* Windows XP SP2 and higher, Windows Server 2003 SP1 and higher, Longhorn, or higher */
#define DIRECTSOUND_VERSION 0x0900  /* Version 9.0 */
#endif
 
#ifdef __cplusplus
struct IDirectSound;
struct IDirectSoundBuffer;
struct IDirectSound3DListener;
struct IDirectSound3DBuffer;
struct IDirectSoundCapture;
struct IDirectSoundCaptureBuffer;
struct IDirectSoundNotify;
#endif // __cplusplus
 
//
// DirectSound 8.0 interfaces.
//
 
#if DIRECTSOUND_VERSION >= 0x0800
 
#ifdef __cplusplus
struct IDirectSound8;
struct IDirectSoundBuffer8;
struct IDirectSoundCaptureBuffer8;
struct IDirectSoundFXGargle;
struct IDirectSoundFXChorus;
struct IDirectSoundFXFlanger;
struct IDirectSoundFXEcho;
struct IDirectSoundFXDistortion;
struct IDirectSoundFXCompressor;
struct IDirectSoundFXParamEq;
struct IDirectSoundFXWavesReverb;
struct IDirectSoundFXI3DL2Reverb;
struct IDirectSoundCaptureFXAec;
struct IDirectSoundCaptureFXNoiseSuppress;
struct IDirectSoundFullDuplex;
#endif // __cplusplus
Цитата Сообщение от Deimon Посмотреть сообщение
Есть ли зависимость от компилятора?
Конечно есть. В выдержке, из книги, которую Вы приводите - рассказывается о методах программирования с одним из .NET языков. В Вашем случае необходимы материалы по C++ (не под конкретную IDE!). Запрос в поисковике на тему "Инициализация Direct Sound" и на первой же позиции получаем ссылку.
1
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
29.11.2012, 14:37  [ТС] 5
Добавил в проект отдельный закголовочный файл с реализацией обозвал (SoundDevice.h /.cpp)
Пока писал в нём программа компилировалась, ошибок в коде не находила (проверял просто на грамматику)
Но как только подключил SoundDevice.h в основном файле Main.h ...программа перестала компилироваться ссылаясь на ошибку в заголвочном файле dsound. Я не понимаю, почему он раньше не ругался?
И почему только сейчас затребовал запятую...?!

C++
1
2
3
4
5
//dsound.h
#ifndef _LPCWAVEFORMATEX_DEFINED
#define _LPCWAVEFORMATEX_DEFINED
typedef const WAVEFORMATEX *LPCWAVEFORMATEX;  //[BCC32 Error] dsound.h(62): E2257 , expected
#endif // _LPCWAVEFORMATEX_DEFINED
помогите, я не понимаю, толи я что-то не так делаю, толи все так сложно с подключением...

Добавлено через 14 минут
Простите за оффтоп, но может это поможет решить проблему:
Скажите, такая схема подключений правильная?
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
29.11.2012, 15:53 6
Цитата Сообщение от Deimon Посмотреть сообщение
Добавил в проект отдельный закголовочный файл с реализацией обозвал (SoundDevice.h /.cpp)
Пока писал в нём программа компилировалась, ошибок в коде не находила (проверял просто на грамматику)
Но как только подключил SoundDevice.h в основном файле Main.h ...программа перестала компилироваться ссылаясь на ошибку в заголвочном файле dsound. Я не понимаю, почему он раньше не ругался?
И почему только сейчас затребовал запятую...?!
Ранее, Ваши файлы не были подключены к исходному проекту и компилятору не было дела, до происходящего там (образно).
Цитата Сообщение от Deimon Посмотреть сообщение
помогите, я не понимаю, толи я что-то не так делаю, толи все так сложно с подключением...
Природа ошибки проста - компилятор не понимает, что такое WAVEFORMATEX и считает, что была допущена синтаксическая ошибка. Для исправления ошибки - необходимо объявление данной структуры. Не буду тянуть и скажу, что это творение MS, а значит описание есть в msdn. В конце статьи, можно ознакомиться с требованиями:
Цитата Сообщение от MSDN
Requirements
Header Mmreg.h (include Mmsystem.h, Mmreg.h, or Mmsystem.h)
А значит, как и было сказано ранее - ничего сложного нет. Для того, чтобы лед тронулся - необходимо подключить "mmsystem.h" или "mmreg.h" перед "dsound.h".

Добавлено через 23 минуты
Цитата Сообщение от Deimon Посмотреть сообщение
Простите за оффтоп, но может это поможет решить проблему:
Скажите, такая схема подключений правильная?

Не по теме:

Размещение изображений и файлов на сторонних ресурсах не рекомендуется - для этого существует прикрипление файлов к сообщению.


Если используются "защитные" директивы (ifndef&define), то любую рабочую схему можно назвать правильной. Но в итоге, компилятор все приводит в вид одной страницы, поэтому если заголовочный файл был подключен - нет необходимости повторять подключение.

resource.h
C++
1
2
3
4
#ifndef resourceH
#define resourceH
const int myval = 10;
#endif
unit1.h
C++
1
2
3
4
5
6
7
#ifndef unit1H
#define unit1H
int plus(void)
{
    return myval + 10;
}
#endif
unit2.h
C++
1
2
3
4
5
6
7
#ifndef unit2H
#define unit2H
int calc(const int val)
{
    return plus() + val;
}
#endif
main.cpp
C++
1
2
3
4
5
6
7
#include "resource.h"
#include "unit1.h"
#include "unit2.h"
main()
{
    calc(20);
}
Как Вы можете убедиться, нигде кроме "main.cpp", нет подключения заголовочных файлов. Существует и множество других конструкций, а так же директива hdrstop (с которой нужно быть внимательней), но данные вопросы относятся к другим разделам.
1
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
29.11.2012, 19:50  [ТС] 7
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Ранее, Ваши файлы не были подключены к исходному проекту и компилятору не было дела
Просто он мне в не подключенном файле при компиляции указывал на ошибки, я надеялся, что после подключения к файлу с функцией main, не чего нового он творить не будет. Что ж, спасибо, теперь буду знать. Это очень важно!


Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Как Вы можете убедиться, нигде кроме "main.cpp", нет подключения заголовочных файлов.
А вот этого я действительно не знал, и даже предположить не мог (0__о)! Странно, что не где в учебниках, что я читал, про это не говорилось, а все примеры были с подключениями. Поправьте, если я не правильно понял, - выходит, что мне вообще не нужен файл resource.h (для хранения общих данных, используемых разными классами), я просто могу описать их после описания какого-нибудь класса. И компилятор не будет ругаться, вне зависимости от настроек проекта, и вне зависимости от того как компилируется, release или debug?


Не по теме:

Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Размещение изображений и файлов на сторонних ресурсах не рекомендуется - для этого существует прикрипление файлов к сообщению.
Извините, я все время пользуюсь "быстрым ответом", а там нету "прикрепления". Буду знать.

0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
30.11.2012, 03:23 8
Цитата Сообщение от Deimon Посмотреть сообщение
Странно, что не где в учебниках, что я читал, про это не говорилось, а все примеры были с подключениями.
На самом деле, при изучении языка программирования - необходимо изучить не малое количество важных аспектов, но осознать весь теоритический материал без практического подкрепления может далеко не каждый (особенно это касается не интерпритационных языков). Поэтому, в большинстве изданий, представляется общий теоритический материал для формирования начальных навыков программирования.

При создании форм в IDE - заголовочный файл тоже создается с подключениями файлов и многие из них будут повторяться. Обратите внимание на связку директив ifndef и define в начале заголовочных файлов:
C++
1
2
3
4
#ifndef unitH
#define unitH
// ...
#endif
Проверяется, было ли объявлено unitH, если нет - то компилятор обрабатывает всю информацию до endif. Таким образом организуется "защита" от повторных подключений данного файла. Теперь рассмотрим следующее:
Кликните здесь для просмотра всего текста
unit1.h
C++
1
2
3
4
5
#ifndef unit1H
#define unit1H
#include "resource.h"
// ...
#endif
unit2.h
C++
1
2
3
4
5
#ifndef unit2H
#define unit2H
#include "resource.h"
// ...
#endif

Обработка "resource.h" будет происходить только в первом случае. При этом подходе не будет ошибок, если подключение не будет объявлено в "main.cpp".
Цитата Сообщение от Deimon Посмотреть сообщение
Поправьте, если я не правильно понял, - выходит, что мне вообще не нужен файл resource.h (для хранения общих данных, используемых разными классами), я просто могу описать их после описания какого-нибудь класса.
Не могу ответить на этот вопрос. Зависит от конкретных условий реализации. Допустим в "resource.h" находятся данные, на которые опираются методы в unit1.h и unit2.h. Можно вынести их в "main.cpp" или в "unit1.h". В-первом случае, придется копировать данные в каждый проект, что не рационально (с таким же успехом можно использовать только один файл). Во-втором случае - подобная реализация может иметь место, пока есть необходимость в "unit1.h" (к примеру в новом проекте не нужен класс из первого файла). Тогда опять придется использовать комбинацию CTRL+C/CTRL+V. Когда дело дойдет до крупных проектов подобная архитектура может вызвать не мало проблем.

Я понимаю, что после выше описанного может появится вопрос "так как же делать?" или "как правильно?". Для ясности, представлю еще один пример. Допустим у Вас есть целая библиотека, где только общих заголовочных файлов десятки. Их все необходимо занести в отдельный файл, к примеру в "mylib.h", без которого файлы с классами (unit[0..99]) работать не будут. А те, что встречаются реже - отдельно подключать в необходимых unit-ах. Таким образом, если "unit[n].h" не будет использоваться, то и нет необходимости подключать какой-нибудь "texture.h", который используется в 3 файлах из 100.

Цитата Сообщение от Deimon Посмотреть сообщение
И компилятор не будет ругаться, вне зависимости от настроек проекта, и вне зависимости от того как компилируется, release или debug?
В отличии от сапера, программист может эксперементировать . Конкретно от режима debug/release данный момент не зависит (базовое различие в том, что в режиме debug в приложении сохраняется отладочная информация). Однако настройки IDE для данных режимов могут отличаться, допустим в debug, директория "c:\myinclude\" была представлена, как один из путей для заголовочных файлов, а в release - нет.

Хочу заметить, что мое изложение представлено в краткой форме и наиболее "простым" образом (что может отличаться от исходной трактовки понятий), для ознакомления. К тому же, при более подробном описании - я могу упустить какие-то моменты, а на какие-то темы просто не хватит времени. Для подтверждения своих слов представляю еще одну конструкцию:
Кликните здесь для просмотра всего текста
resource.h
C++
1
2
3
4
#ifndef resourceH
#define resourceH
int myvalue = 30;
#endif
unit1.h
C++
1
2
3
4
5
#ifndef unit1H
#define unit1H
void unit1_setvalue(void);
int unit1_getvalue(void);
#endif
unit2.h
C++
1
2
3
4
5
#ifndef unit2H
#define unit2H
void unit2_setvalue(void);
int unit2_getvalue(void);
#endif
unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
// ...
#include "unit1.h"
#include "resource.h"
// ...
void unit1_setvalue(void)
{
    myvalue = 10;
}
int unit1_getvalue(void)
{
    return myvalue;
}
unit2.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
// ...
#include "unit2.h"
#include "resource.h"
// ...
void unit2_setvalue(void)
{
    myvalue = 20;
}
int unit2_getvalue(void)
{
    return myvalue;
}
Как и прежде используется файл "resource.h", в котором объявлена переменная myvalue по умолчанию равная 30. Как я и говорил, связка ifndef&define не позволяет повторно использовать заголовочный файл. Но давайте посмотрим, что происходит в "main.cpp":

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// ...
#include "resource.h"
#include "unit1.h"
#include "unit2.h"
// ...
main()
{
    myvalue;            // get: myvalue = 30
    unit1_getvalue();   // get: myvalue = 30
    unit2_getvalue();   // get: myvalue = 30
    // пока все по фен-шую
    unit1_setvalue();   // set: myvalue = 10
    unit2_setvalue();   // set: myvalue = 20
    unit1_getvalue();   // get: myvalue = 10
    unit2_getvalue();   // get: myvalue = 20
    myvalue;            // get: myvalue = 30
}
В чем магия подобного действия? Файлы .cpp не являются заголовочными и не подключены, поэтому происходящее внутри обрабатывается отдельным образом. В итоге исходные данные можно использовать совсем в другом ключе. Подобных нюансов великое множество, поэтому для их изучения - необходимо обратиться к более подробному и компетентному источнику.

Не по теме:

Цитата Сообщение от Deimon Посмотреть сообщение
Извините, я все время пользуюсь "быстрым ответом", а там нету "прикрепления". Буду знать.
Информация на стронних ресурсах, как правило, имеет временный характер. Через пару месяцев, когда у посетителей форума возникнет схожая проблема они не смогут получить полную "картину" Вашей темы. Поэтому рекомендуется сохранять данные на форуме.

1
30.11.2012, 03:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2012, 03:23
Помогаю со студенческими работами здесь

Ошибка после переустановки ОС: Reboot and Select proper Boot device Or Insert boot Media in selected Boot device and press a key
У меня такая проблема , я решил переустановить винду, зашёл в Биос , поменял там приоритеты,...

При загрузке компьютера ошибка: Reboot and Select proper Boot device or Insert Boot Media in selected Boot device and press a kay
Всем привет, возникла проблема, надеюсь подскажете как ее решить. Сам мало что понимаю в...

При загрузке компьютера ошибка: Reboot and Select proper Boot device or Insert Boot Media in selected Boot device and press a key
в компьютере разбираюсь плохо,напишите пожалуйста попроще,что это за проблема и как ее исправить?

Ошибка reboot and select proper boot device or insert boot media in selected boot device and press a key
Здравствуйте!сегодня сидел в вконтакте и завис комп нажал на кнопку перезагрузки и комп выдал...

Ошибка: Reboot and Select proper Boot device or Insert boot Media in selected Boot device and Pres a key
Есть ноут и 2 диска: 1. ssd подключен вместо dvd , на нем установлена система 2. hdd - который...

Ошибка reboot and select proper boot device or insert boot media in selected boot device and press a key
установила хр. все установилось но есть но..когда включаю комп с установочн диском все работает, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru