Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
mr_free
70 / 4 / 7
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
#1

Работа со звуком! Ошибка! SOS! - C++

10.08.2012, 18:32. Просмотров 1996. Ответов 7
Метки нет (Все метки)

Доброго времени суток, пишу аппаратный генератор СЛ на основе звуковой карты! Сразу предупреждаю в Visual C++ я человек новый, пишу код по одной хорошей статейке (см. ресурс Скажем вирусам "Нет!"). И вот компиляция сама проходит успешно, но при запуске идут 6 неразрешенных внешних ошибок, как разрешить данную проблему, удивляет, то что ошибка в выводе об ошибке? да, и подскажите на будущее, чем спровоцирована ошибка?!
Ошибки:
Код
GNR.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__waveInUnprepareHeader@12 в функции "void __stdcall onBufferIn(struct HWAVEIN__ *,unsigned int,unsigned long,unsigned long,unsigned long)" (?onBufferIn@@YGXPAUHWAVEIN__@@IKKK@Z)
GNR.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__waveInStop@4 в функции "void __cdecl openDevice(void)" (?openDevice@@YAXXZ)
GNR.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__waveInStart@4 в функции "void __cdecl openDevice(void)" (?openDevice@@YAXXZ)
GNR.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__waveInAddBuffer@12 в функции "void __cdecl openDevice(void)" (?openDevice@@YAXXZ)
3.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__waveInPrepareHeader@12 в функции "void __cdecl openDevice(void)" (?openDevice@@YAXXZ)
А вот код, где они происходят:
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
42
43
44
45
46
47
#include <iostream>
#include <fstream>
#include "stdafx.h"
#include <windows.h>
#include <math.h>
void openDevice()
{
    HWAVEIN hWaveIn;
    WAVEHDR waveHdr;
    WAVEFORMATEX waveFormat;
 
    //open
    waveFormat.wFormatTag = WAVE_FORMAT_PCM;
    waveFormat.nChannels = 1;
    waveFormat.nSamplesPerSec = 44100L;
    waveFormat.wBitsPerSample = 16;
    waveFormat.nBlockAlign = 2; //bytes
    waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;
    waveFormat.cbSize = 0;
 
    MMRESULT result;
    result = waveInOpen(&hWaveIn, 1, &waveFormat, (DWORD)onBufferIn, 0, CALLBACK_FUNCTION);
    if (result != MMSYSERR_NOERROR) std::cout << "waveInOpen error" << std::endl;
 
    ULONG bufferSize = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign * 1;
 
    ZeroMemory(&waveHdr, sizeof(WAVEHDR));
    waveHdr.lpData = (LPSTR)malloc(bufferSize);
    waveHdr.dwBufferLength = bufferSize;
 
    //prepare
    result = waveInPrepareHeader(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    if (result != MMSYSERR_NOERROR)
        std::cout << "waveInPrepareHeader error " << result << std::endl;
 
    //add buffer
    result = waveInAddBuffer(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    if (result != MMSYSERR_NOERROR)
        std::cout << "waveInAddBuffer error " << result << std::endl;
 
    result = waveInStart(hWaveIn);
    if (result != MMSYSERR_NOERROR)
        std::cout << "waveInStart error" << result <<std:: endl;
 
    Sleep(2000);
    waveInStop(hWaveIn);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2012, 18:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа со звуком! Ошибка! SOS! (C++):

Работа со звуком! (Ошибка) Аппаратный генератор случайных чисел!
Доброго времени суток занимаюсь созданием аппаратного генератора случайных...

Работа со звуком
Интересует работа со звуком. Какие вообще существуют библиотеки для работы с...

Работа со звуком в C++
В общем сабж таков : В системе , играется какой либо файл , на каком либо...

Работа со звуком
Здравствуйте, вот занимаюсь работай со звуком, вообще задача стоит в том что б...

Работа со звуком
Доброго времени суток. Подскажите, какой библиотекой лучше всего...

Работа со звуком в с++
Добрый вечер. В общем дали мне курсовик. Надо написать программу которая с...

7
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
10.08.2012, 18:34 #2
По ссылке вирус JS/Agent.NEN
0
mr_free
70 / 4 / 7
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
10.08.2012, 18:42  [ТС] #3
Знаю, увы на ссылке вирус, но для чего ж стоит антивирус! Но я действительно делал по этой статье!
П.с. Тоже стоит есет смарт?!
0
mr_free
70 / 4 / 7
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
10.08.2012, 18:47  [ТС] #4
Вот даже скрин, вообщем дело не в статье кому, надо статью пишите перекопирую с сайта в документ и скину, помогите с ошибками,пожалуйста
0
Миниатюры
Работа со звуком! Ошибка! SOS!  
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
10.08.2012, 20:38 #5
Как минимум странно то, что нет main-функции, которая должна быть.
Код, судя по всему, не полный, ибо, допустим, выдается ошибка здесь :
C++
1
result = waveInOpen(&hWaveIn, 1, &waveFormat, (DWORD)onBufferIn, 0, CALLBACK_FUNCTION);
Ибо нет переменной onBufferIn, которая, видимо, задана глобально где-то ещё.
Так же рекомендую поменять местами библиотеки на :
C++
1
2
3
4
5
#include "stdafx.h"
 #include <windows.h>
#include <iostream>
 #include <fstream>
 #include <math.h>
Ну и добавить main, хотя бы так :
C++
1
2
3
4
int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
Подключив
#include <tchar.h>
если её нет
0
-=ЮрА=-
Заблокирован
Автор FAQ
10.08.2012, 22:13 #6
mr_free, всё просто не хватало хедера mmsystem.h и библиотеки winmm.lib, единственое - ваш код не полон, поэтому приводите и вашу waveInProc (тобишь onBufferIn)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <fstream>
#include <iostream>
#include <windows.h>
/////Вот єтого не хватало////////
#include <mmsystem.h>
#include <dsound.h>
 
#pragma comment(lib,"winmm.lib") 
#pragma comment(lib,"dsound.lib")
////////////////////////////////
using namespace std;
 
void openDevice()
{
    HWAVEIN hWaveIn;
    WAVEHDR waveHdr;
    WAVEFORMATEX waveFormat;
 
    //open
    waveFormat.wFormatTag = WAVE_FORMAT_PCM;
    waveFormat.nChannels = 1;
    waveFormat.nSamplesPerSec = 44100L;
    waveFormat.wBitsPerSample = 16;
    waveFormat.nBlockAlign = 2; //bytes
    waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;
    waveFormat.cbSize = 0;
 
    MMRESULT result;
    result = waveInOpen(&hWaveIn, 1, &waveFormat, /*(DWORD)onBufferIn*/NULL, 0, CALLBACK_FUNCTION);
    if (result != MMSYSERR_NOERROR) 
        cout << "waveInOpen error" << endl;
 
    ULONG bufferSize = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign * 1;
 
    ZeroMemory(&waveHdr, sizeof(WAVEHDR));
    waveHdr.lpData = (LPSTR)malloc(bufferSize);
    waveHdr.dwBufferLength = bufferSize;
 
    //prepare
    result = waveInPrepareHeader(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    if (result != MMSYSERR_NOERROR)
        cout << "waveInPrepareHeader error " << result << endl;
 
    //add buffer
    result = waveInAddBuffer(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    if (result != MMSYSERR_NOERROR)
        cout << "waveInAddBuffer error " << result << endl;
 
    result = waveInStart(hWaveIn);
    if (result != MMSYSERR_NOERROR)
        cout << "waveInStart error" << result <<endl;
 
    Sleep(2000);
    waveInStop(hWaveIn);
}
 
int main()
{
    openDevice();
    return 0;
}
Т.к. начинающие часто не меняют дефалтный юникод проекта на привычный глазу MultyByteCharactersSet (по ссылке мой пост показывающий как это сделать
http://www.cyberforum.ru/win-api/thread631136-page2.html#post3318151)
Проект в аттаче как бонус (надеюсь вам известно что такие проекты надо открывать через sln т.е. workspace файл)

Не по теме:

От себя:

Цитата Сообщение от mr_free Посмотреть сообщение
std::cout <<
- просто почитайте эту мою запись
http://www.cyberforum.ru/blogs/34326/blog275.html
выводы делайте сами, но полистать её пару страниц думаю у вас трудов не составит...

1
Миниатюры
Работа со звуком! Ошибка! SOS!  
Вложения
Тип файла: rar sound_VS9_proj.rar (4.5 Кб, 22 просмотров)
mr_free
70 / 4 / 7
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
11.08.2012, 23:21  [ТС] #7
Благодарю, за помощь! Но возникли новые ошибки. Решать которые уже буду завтра, но пока, выложу их:
GRN.cpp(57): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
GRN.cpp: error C2143: синтаксическая ошибка: отсутствие ")" перед ">"
GRN.cpp(57): error C2059: синтаксическая ошибка: >
GRN.cpp(57): error C2059: синтаксическая ошибка: )
GRN.cpp(58): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
GRN.cpp(58): error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)
Больше всего меня смущает выделенная строка ошибки! Вот собственно новый код с учетом замечаний:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <fstream>
#include <iostream>
#include <windows.h>
#include "stdafx.h"
#include <mmsystem.h>
using namespace std;
 
void processData(const >short* data, const int n)
{
    std::ofstream output("data.txt");
    output.flags(std::ios::right+std::ios::fixed);
 
    double avr = 0.0;
    double deviation = 1.0;
 
    const double outDeviation = 13.0f;
    const double outAvr = 13.0f;
 
    for (int i = 0; i < n; i++)
    {
        avr += (double)data[i];
        deviation += (double)(data[i] * data[i]);
    }
 
    avr /= (double)n;
    deviation = sqrt(deviation / (double)n - avr * avr);
 
    for (int i = 0; i < n; i++)
    {
        double conv = (outDeviation * (double)data[i]) / deviation + 
            outAvr - (outDeviation * avr) / deviation;
        output << conv << std::endl;        
        //output << (short)data[i] << std::endl;
    }
 
    output.close();
}
 
void CALLBACK onBufferIn(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, 
                              DWORD dwParam1, DWORD dwParam2)
{
    switch (uMsg)
    {
    case WIM_DATA:
        std::cout << "data message" << std::endl;
 
        LPWAVEHDR lpWaveHdr;
 
        lpWaveHdr = (LPWAVEHDR)dwParam1;
        std::cout << "recorded = " << lpWaveHdr->dwBytesRecorded << std::endl;
        std::cout << "coping.." << std::endl;
 
        void* bufferData = malloc(lpWaveHdr->dwBytesRecorded);
        memcpy((void *)bufferData, (const void*)lpWaveHdr->lpData, lpWaveHdr->dwBytesRecorded);
 
        processData((short*)bufferData, lpWaveHdr->dwBytesRecorded / sizeof(short));
 
        free(bufferData);
        waveInUnprepareHeader(hwi, lpWaveHdr, sizeof(WAVEHDR));
        free(lpWaveHdr->lpData);
 
        break;
    }
}
void openDevice()
{
    HWAVEIN hWaveIn;
    WAVEHDR waveHdr;
    WAVEFORMATEX waveFormat;
 
    //open
    waveFormat.wFormatTag = WAVE_FORMAT_PCM;
    waveFormat.nChannels = 1;
    waveFormat.nSamplesPerSec = 44100L;
    waveFormat.wBitsPerSample = 16;
    waveFormat.nBlockAlign = 2; //bytes
    waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;
    waveFormat.cbSize = 0;
 
    MMRESULT result;
    result = waveInOpen(&hWaveIn, 1, &waveFormat, /*(DWORD)onBufferIn*/NULL, 0, CALLBACK_FUNCTION);
    if (result != MMSYSERR_NOERROR) 
        cout << "waveInOpen error" << endl;
 
    ULONG bufferSize = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign * 1;
 
    ZeroMemory(&waveHdr, sizeof(WAVEHDR));
    waveHdr.lpData = (LPSTR)malloc(bufferSize);
    waveHdr.dwBufferLength = bufferSize;
 
    //prepare
    result = waveInPrepareHeader(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    if (result != MMSYSERR_NOERROR)
        cout << "waveInPrepareHeader error " << result << endl;
 
    //add buffer
    result = waveInAddBuffer(hWaveIn, &waveHdr, sizeof(WAVEHDR));
    if (result != MMSYSERR_NOERROR)
        cout << "waveInAddBuffer error " << result << endl;
 
    result = waveInStart(hWaveIn);
    if (result != MMSYSERR_NOERROR)
        cout << "waveInStart error" << result <<endl;
 
    Sleep(2000);
    waveInStop(hWaveIn);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    openDevice();
 
    return 0;
}
0
komand0
8 / 8 / 4
Регистрация: 20.06.2012
Сообщений: 225
27.04.2014, 19:36 #8
вы забыли сделать то что вам сказали.. например
C++
1
2
3
4
5
#include <mmsystem.h>
#include <dsound.h>
 
#pragma comment(lib,"winmm.lib") 
#pragma comment(lib,"dsound.lib")
0
27.04.2014, 19:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2014, 19:36
Привет! Вот еще темы с решениями:

Бесконечная сумма с точностью Е (while do/while) SOS SOS
E=0.0001 Вот мои жалкие потуги. #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

SOS!!!!!SOS!!!!Даны натуральные числа от 20 до 50
Даны натуральные числа от 20 до 50.Напечатать те из них, которые делятся на...

Работа со звуком (VS 2012)
include &lt;fstream&gt; #include &lt;iostream&gt; using namespace std; struct WAVHEADER...

Работа со звуком (частоты)
Привет. Меня интересует как работать со звуком на С-подобных языках. Какие...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru