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

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

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

Перехват URL C++
C++ С++ и аудио файлы
Аудио плеер C++
Аудио C++
Создание потока из потока. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
11.01.2013, 22:00     Перехват аудио потока #2
...там же, вместе с BASS идет пример считывания и отрисовки со стерео-микшера в реальном времени.
Razangann
9 / 9 / 0
Регистрация: 11.01.2013
Сообщений: 133
12.01.2013, 11:49  [ТС]     Перехват аудио потока #3
Я понимаю) Разбирал пример, но там работа с внешним микрофоном, а как изменить параметры, чтобы захват производился со всего компьютера?=) какая функция отвечает за параметры аудиоустройства?)

Добавлено через 20 минут
Как я понимаю, функция BASS_ChannelGetData(RECORDCHAN,fft,BASS_DATA_FFT2048); получает амплитуду определенной частоты, а RECORDCHAN - указатель на устройство микрофона правильно? а как передать в функцию указатель на аудиокарту, чтобы весь звук использовался?=)
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
12.01.2013, 13:39     Перехват аудио потока #4
...получить через BASS-же список аудиоустройств и выбрать стерео-микшер. Андерстенд?
Razangann
9 / 9 / 0
Регистрация: 11.01.2013
Сообщений: 133
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);

спасибо =Ъ
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
12.01.2013, 18:39     Перехват аудио потока #6
...эх, держите:
Перехват аудио потока
Вложения
Тип файла: zip спектр на BASS_realtime.zip (6.66 Мб, 122 просмотров)
Razangann
9 / 9 / 0
Регистрация: 11.01.2013
Сообщений: 133
12.01.2013, 19:35  [ТС]     Перехват аудио потока #7
Вот незадача=))) Спасибо конечно за ваш труд, но я не знаю чем открыть данные файлы) Работаю на Visual studio 10) Не составит ли вам большого труда переделать как-нибудь в проект Visual studio?=)
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
12.01.2013, 19:46     Перехват аудио потока #8
...зачем? Вся последовательность действий и команды остаются теми же, абсолютно, DLL-ка одна та же. Синтаксис чуть меняется, а где и вообще не меняется.
Razangann
9 / 9 / 0
Регистрация: 11.01.2013
Сообщений: 133
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ке не работает кажется=)
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
12.01.2013, 20:13     Перехват аудио потока #10
Delphi. Не нужно пытаться открывать проект в VS, скопируйте саму инициализацию, вызов будет идентичным. В конце-концов, если нет понимания работы с самой BASS.DLL - откройте справку, она приложена к официальному sDK.
Razangann
9 / 9 / 0
Регистрация: 11.01.2013
Сообщений: 133
12.01.2013, 20:18  [ТС]     Перехват аудио потока #11
Хорошо, спасибо за ответы) Думаю разберусь=)
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
12.01.2013, 20:21     Перехват аудио потока #12
Конечно разберетесь, не боги горшки обжигают.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2013, 13:53     Перехват аудио потока
Еще ссылки по теме:

Перехват сообщения C++
C++ Вызывть метод одного потока из другого потока
Перехват функций C++

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

Или воспользуйтесь поиском по форуму:
Razangann
9 / 9 / 0
Регистрация: 11.01.2013
Сообщений: 133
15.01.2013, 13:53  [ТС]     Перехват аудио потока #13
Блин....не получается никак=((а нельзя просто создать указатель на устройство вывода звука, и передать его в функцию BASS_ChannelGetData(RECORDCHAN,fft,BASS_DATA_FFT2048); вместо RECORDCHAN??? как это сделать?=( Пожалуйста помогите, если можно кодом...исходный прикрепил=)
Вложения
Тип файла: txt Код.txt (5.7 Кб, 25 просмотров)
Yandex
Объявления
15.01.2013, 13:53     Перехват аудио потока
Ответ Создать тему
Опции темы

Текущее время: 07:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru