Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 5.00
Razangann
12 / 12 / 0
Регистрация: 11.01.2013
Сообщений: 135
#1

Перехват аудио потока - C++

11.01.2013, 18:37. Просмотров 2231. Ответов 12
Метки нет (Все метки)

Добрый вечер. Появилась такая задумка, создать графический эквалайзер, который считывает звук со всего компьютера=) Кто может помочь с этим? Разбирал пример с bass.dll, который открывает песню и рисует по ней, но как считать аудио поток с аудиокарты не знаю=( Заранее спасибо =Ъ
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2013, 18:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перехват аудио потока (C++):

Вызывть метод одного потока из другого потока - C++
Здравствуйте, подскажите пожалуйста, как можно реализовать такую штуку : есть один поток(1), который вызывает метод у обьекта, этот...

Создание потока из потока. - C++
Надо создать поток 1, в нем создать поток 2, сам я жуткий дураг, немаловероятно что правильного в коде вообще ничего нет ) ругается...

Два потока, две очереди, два потока - C++
Есть две очереди. Каждая из них заполняется своим потоком. Есть два потока, которые достают данные из своей очереди. Но когда одна из...

Аудио - C++
Здравствуйте, подскажите пожалуйста примерами, ну или укажите куда копать) Как сделать так, чтоб например, скачивая какой-то файл, например...

аудио-проигрыватель с++ - C++
у меня есть программа проигрывателя .....но понять не могу....есть у кого нить еще проще. или в этом коментировать каждую строку.

С++ и аудио файлы - C++
Здравствуйте! Я пишу на С++ тест на определение порога звуковой чувствительности человеческого уха. Подскажите пожалуйста, каким...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxp
10162 / 6549 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
11.01.2013, 22:00 #2
...там же, вместе с BASS идет пример считывания и отрисовки со стерео-микшера в реальном времени.
1
Razangann
12 / 12 / 0
Регистрация: 11.01.2013
Сообщений: 135
12.01.2013, 11:49  [ТС] #3
Я понимаю) Разбирал пример, но там работа с внешним микрофоном, а как изменить параметры, чтобы захват производился со всего компьютера?=) какая функция отвечает за параметры аудиоустройства?)

Добавлено через 20 минут
Как я понимаю, функция BASS_ChannelGetData(RECORDCHAN,fft,BASS_DATA_FFT2048); получает амплитуду определенной частоты, а RECORDCHAN - указатель на устройство микрофона правильно? а как передать в функцию указатель на аудиокарту, чтобы весь звук использовался?=)
0
raxp
10162 / 6549 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
12.01.2013, 13:39 #4
...получить через BASS-же список аудиоустройств и выбрать стерео-микшер. Андерстенд?
1
Razangann
12 / 12 / 0
Регистрация: 11.01.2013
Сообщений: 135
12.01.2013, 14:00  [ТС] #5
Хммм...не совсем=) получается мне нужна переменная типа DWORD допустим "chan" которую я передаю в функцию допустим так BASS_ChannelGetData(chan,fft,BASS_DATA_FFT2048); но перед этим ей нужно присвоить значение. Как это сделать? Если работа с фалом, то chan=BASS_StreamCreateFile(FALSE,file,0,0,0)). а как чтобы работа с общим звуком, подскажите пожалуйста функцию, а если не трудно код=) что-то на подобии

Добавлено через 58 секунд
DWORD chan;
chan=BASS_StreamCreateFile(FALSE,file,0,0,0);
BASS_ChannelGetData(chan,fft,BASS_DATA_FFT2048);

спасибо =Ъ
0
raxp
10162 / 6549 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
12.01.2013, 18:39 #6
...эх, держите:
Перехват аудио потока
1
Вложения
Тип файла: zip спектр на BASS_realtime.zip (6.66 Мб, 131 просмотров)
Razangann
12 / 12 / 0
Регистрация: 11.01.2013
Сообщений: 135
12.01.2013, 19:35  [ТС] #7
Вот незадача=))) Спасибо конечно за ваш труд, но я не знаю чем открыть данные файлы) Работаю на Visual studio 10) Не составит ли вам большого труда переделать как-нибудь в проект Visual studio?=)
0
raxp
10162 / 6549 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
12.01.2013, 19:46 #8
...зачем? Вся последовательность действий и команды остаются теми же, абсолютно, DLL-ка одна та же. Синтаксис чуть меняется, а где и вообще не меняется.
1
Razangann
12 / 12 / 0
Регистрация: 11.01.2013
Сообщений: 135
12.01.2013, 19:53  [ТС] #9
Проблема как раз в том, что проект открыть не могу) Просто недавно сам начал изучать программирование, не многое понимаю ещё=) Открыл исходный код, закинул в .ccp, а к нему ещё что-то на подобии ресурсов же нужно?=) а то 75% кода Visual не воспринимает, и как я понял, Вы писали на паскале?=)

Добавлено через 2 минуты
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#include <windows.h>
#include <stdio.h>
#include <math.h>
#include "bass.h"
 
#define SPECWIDTH 320   // display width
#define SPECHEIGHT 127  // height (changing requires palette adjustments too)
 
HINSTANCE inst;
HWND win=NULL;
DWORD timer=0;
 
DWORD chan;
 
HDC specdc=0;
HBITMAP specbmp=0;
BYTE *specbuf;
 
int specmode=0,specpos=0; // spectrum mode (and marker pos for 2nd mode)
 
/* display error messages */
void Error(char *es)
{
    char mes[200];
    sprintf(mes,"%s\n(error code: %d)",es,BASS_ErrorGetCode());
    MessageBox(win,mes,"Error",0);
}
 
 
 
/* update the spectrum display - the interesting bit :) */
void CALLBACK UpdateSpectrum(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
    static DWORD quietcount=0;
    HDC dc;
    int x,y,y1;
    float fft[1024]; // get the FFT data
    BASS_ChannelGetData(RECORDCHAN,fft,BASS_DATA_FFT2048);
 
    if (!specmode) 
    {
        memset(specbuf,0,SPECWIDTH*SPECHEIGHT);
        for (x=0;x<SPECWIDTH/2;x++) 
        {
    #if 1
            y=sqrt(fft[x+1])*3*SPECHEIGHT-4; // scale it (sqrt to make low values more visible)
#else
            y=fft[x+1]*10*SPECHEIGHT; // scale it (linearly)
#endif
            if (y>SPECHEIGHT) y=SPECHEIGHT; // cap it
            if (x && (y1=(y+y1)/2)) // interpolate from previous to make the display smoother
                while (--y1>=0) specbuf[y1*SPECWIDTH+x*2-1]=y1+1;
            y1=y;
            while (--y>=0) specbuf[y*SPECWIDTH+x*2]=y+1; // draw level
        }
    } else
    {
        for (x=0;x<SPECHEIGHT;x++)
        {
            y=sqrt(fft[x+1])*3*127; // scale it (sqrt to make low values more visible)
            if (y>127) y=127; // cap it
            specbuf[x*SPECWIDTH+specpos]=128+y; // plot it
        }
        // move marker onto next position
        specpos=(specpos+1)%SPECWIDTH;
        for (x=0;x<SPECHEIGHT;x++) specbuf[x*SPECWIDTH+specpos]=255;
    }
 
    // update the display
    dc=GetDC(win);
    BitBlt(dc,0,0,SPECWIDTH,SPECHEIGHT,specdc,0,0,SRCCOPY);
    if (LOWORD(BASS_ChannelGetLevel(RECORDCHAN))<3) 
    { // check if it's quiet
        quietcount++;
        if (quietcount>40 && (quietcount&16))
        { // it's been quiet for over a second
            RECT r={0,0,SPECWIDTH,SPECHEIGHT};
            SetTextColor(dc,0xffffff);
            SetBkMode(dc,TRANSPARENT);
            DrawText(dc,"make some noise!",-1,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
        }
    } else
        quietcount=0; // not quiet
    ReleaseDC(win,dc);
}
 
// Recording callback - not doing anything with the data
BOOL CALLBACK DuffRecording(void *buffer, DWORD length, DWORD user)
{
    return TRUE; // continue recording
}
 
/* window procedure */
long FAR PASCAL SpectrumWindowProc(HWND h, UINT m, WPARAM w, LPARAM l)
{
    switch (m) 
    {
        case WM_PAINT:
            if (GetUpdateRect(h,0,0))
            {
                PAINTSTRUCT p;
                HDC dc;
                if (!(dc=BeginPaint(h,&p))) 
                    return 0;
                BitBlt(dc,0,0,SPECWIDTH,SPECHEIGHT,specdc,0,0,SRCCOPY);
                EndPaint(h,&p);
            }
            return 0;
 
        case WM_LBUTTONUP:
            specmode^=1; // swap spectrum mode
            memset(specbuf,0,SPECWIDTH*SPECHEIGHT); // clear display
            return 0;
 
        case WM_CREATE:
            win=h;
            // initialize BASS recording (default device)
            if (!BASS_RecordInit(-1))
            {
                Error("Can't initialize device");
                return -1;
            }
            // start recording (44100hz mono 16-bit)
            if (!BASS_RecordStart(44100,BASS_SAMPLE_MONO,&DuffRecording,0))
            {
                Error("Can't start recording");
                return -1;
            }
            { // create bitmap to draw spectrum in - 8 bit for easy updating :)
                BYTE data[2000]={0};
                BITMAPINFOHEADER *bh=(BITMAPINFOHEADER*)data;
                RGBQUAD *pal=(RGBQUAD*)(data+sizeof(*bh));
                int a;
                bh->biSize=sizeof(*bh);
                bh->biWidth=SPECWIDTH;
                bh->biHeight=SPECHEIGHT; // upside down (line 0=bottom)
                bh->biPlanes=1;
                bh->biBitCount=8;
                bh->biClrUsed=bh->biClrImportant=256;
                // setup palette
                for (a=1;a<128;a++)
                {
                    pal[a].rgbBlue=255-2*a;
                    pal[a].rgbGreen=2*a;
                }
                for (a=0;a<32;a++) 
                {
                    pal[128+a].rgbBlue=8*a;
                    pal[128+32+a].rgbBlue=255;
                    pal[128+32+a].rgbRed=8*a;
                    pal[128+64+a].rgbRed=255;
                    pal[128+64+a].rgbBlue=8*(31-a);
                    pal[128+64+a].rgbGreen=8*a;
                    pal[128+96+a].rgbRed=255;
                    pal[128+96+a].rgbGreen=255;
                    pal[128+96+a].rgbBlue=8*a;
                }
                // create the bitmap
                specbmp=CreateDIBSection(0,(BITMAPINFO*)bh,DIB_RGB_COLORS,&specbuf,NULL,0);
                specdc=CreateCompatibleDC(0);
                SelectObject(specdc,specbmp);
            }
            // setup update timer (40hz)
            timer=timeSetEvent(25,25,(LPTIMECALLBACK)&UpdateSpectrum,0,TIME_PERIODIC);
            break;
 
        case WM_DESTROY:
            if (timer) timeKillEvent(timer);
            BASS_RecordFree();
            if (specdc) DeleteDC(specdc);
            if (specbmp) DeleteObject(specbmp);
            PostQuitMessage(0);
            break;
    }
    return DefWindowProc(h, m, w, l);
}
 
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS wc={0};
    MSG msg;
 
    inst=hInstance;
 
    // check that BASS 1.8 was loaded
    if (BASS_GetVersion()!=MAKELONG(1,8))
    {
        MessageBox(0,"BASS version 1.8 was not loaded","Incorrect BASS.DLL",0);
        return 0;
    }
 
    // register window class and create the window
    wc.lpfnWndProc = SpectrumWindowProc;
    wc.hInstance = inst;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = "BASS-Spectrum";
    if (!RegisterClass(&wc) || !CreateWindow("BASS-Spectrum","BASS \"live\" spectrum (click to toggle mode)",WS_POPUPWINDOW|WS_CAPTION|WS_VISIBLE, 200, 200,SPECWIDTH+2*GetSystemMetrics(SM_CXDLGFRAME),SPECHEIGHT+GetSystemMetrics(SM_CYCAPTION)+2*GetSystemMetrics(SM_CYDLGFRAME),NULL, NULL, inst, NULL))
    {
        Error("Can't create window");
        return 0;
    }
    ShowWindow(win, SW_SHOWNORMAL);
 
    while (GetMessage(&msg,NULL,0,0)>0) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
Вот код программы, где считывает с микрофона, как можно его подкоректировать для моего случая? =Ъ
P.S. Ознакомился по ближе с программой, она для XP? На 8ке не работает кажется=)
0
raxp
10162 / 6549 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
12.01.2013, 20:13 #10
Delphi. Не нужно пытаться открывать проект в VS, скопируйте саму инициализацию, вызов будет идентичным. В конце-концов, если нет понимания работы с самой BASS.DLL - откройте справку, она приложена к официальному sDK.
1
Razangann
12 / 12 / 0
Регистрация: 11.01.2013
Сообщений: 135
12.01.2013, 20:18  [ТС] #11
Хорошо, спасибо за ответы) Думаю разберусь=)
0
raxp
10162 / 6549 / 477
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
12.01.2013, 20:21 #12
Конечно разберетесь, не боги горшки обжигают.
0
Razangann
12 / 12 / 0
Регистрация: 11.01.2013
Сообщений: 135
15.01.2013, 13:53  [ТС] #13
Блин....не получается никак=((а нельзя просто создать указатель на устройство вывода звука, и передать его в функцию BASS_ChannelGetData(RECORDCHAN,fft,BASS_DATA_FFT2048); вместо RECORDCHAN??? как это сделать?=( Пожалуйста помогите, если можно кодом...исходный прикрепил=)
0
Вложения
Тип файла: txt Код.txt (5.7 Кб, 27 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2013, 13:53
Привет! Вот еще темы с ответами:

Аудио плеер - C++
Хочу взять в качестве курсовой, да и сам давно хотел попробовать что-то такое. Сложно ли на С++ написать аудио плеер? И что для этого надо?...

Перехват URL - C++
Доброго времени! В общем задача следующая, нужно написать программку, которая сидела бы в трее, а лучше вообще нигде не сидела(ну кроме...

Перехват сообщения - C++
Я не уверен, что пишу вопрос в нужный раздел, но все же задам: У меня на компьютере лежит папка. Мне нужно с помощью чего нибудь...

Перехват функции - C++
Приветствую всех. Есть хорошая статья по перехвату API функции. http://habrahabr.ru/post/90377/ Но есть проблема. Как мне...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.01.2013, 13:53
Ответ Создать тему
Опции темы

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