Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Mmsystem. Запись и воспроизведение звука.


Автор: Mmsystem 1.7.2014, 18:03
Здравствуйте.
Написал небольшую программку записывающую звук с микрофона и проигрывающую его.
Проблема в том, что воспроизводится только левый канал.

Переделывал для проигрывания готового wav файла(стерео), всё равно воспроизводит только левый канал.

В чём может быть ошибка?
(Пишу в Visual Studio под Windows)


Код

#include "stdafx.h"

#include <iostream>
#include <windows.h>
#include <mmsystem.h>
#include <fstream>

#pragma comment(lib,"winmm.lib") 


using namespace std;

int sampleRate = 44100;

short int *waveIn;


void main()
{
        //Формат данных
    WAVEFORMATEX pFormat;
    pFormat.wFormatTag = WAVE_FORMAT_PCM;
    pFormat.nChannels = 2;               //Стерео - 2 канала   
    pFormat.wBitsPerSample = 16;            
    pFormat.nSamplesPerSec = sampleRate;     
    pFormat.nAvgBytesPerSec = sampleRate * pFormat.nChannels * pFormat.wBitsPerSample / 8; 
    pFormat.nBlockAlign = pFormat.nChannels * pFormat.wBitsPerSample / 8;    
    pFormat.cbSize = 0;

    waveIn = new short int[pFormat.nAvgBytesPerSec * 2];

    memset(waveIn,0,pFormat.nAvgBytesPerSec * 2);
   
       //Запись звука в буфер waveIn
    HWAVEIN hWaveIn;
    WAVEHDR waveInHdr;

    waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat, NULL, NULL, WAVE_FORMAT_DIRECT);

    waveInHdr.lpData = (LPSTR)waveIn;
    waveInHdr.dwBufferLength = pFormat.nAvgBytesPerSec * 2;
    waveInHdr.dwBytesRecorded = 0;
    waveInHdr.dwUser = 0L;
    waveInHdr.dwFlags = 0L;
    waveInHdr.dwLoops = 0L;

    waveInPrepareHeader(hWaveIn, &waveInHdr, sizeof(WAVEHDR));

    waveInAddBuffer(hWaveIn, &waveInHdr, sizeof(WAVEHDR));

    waveInStart(hWaveIn);

    do{} 
    while(waveInUnprepareHeader(hWaveIn, &waveInHdr, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING);

    waveInClose(hWaveIn);
    
       //Воспроизведение из буфера waveIn
    HWAVEOUT hWaveOut;
    WAVEHDR WaveOutHdr;

    waveOutOpen(&hWaveOut, WAVE_MAPPER, &pFormat, NULL, NULL, WAVE_FORMAT_DIRECT);


    WaveOutHdr.lpData = (LPSTR)waveIn;
    WaveOutHdr.dwBufferLength = pFormat.nAvgBytesPerSec * 2;
    WaveOutHdr.dwBytesRecorded = 0;
    WaveOutHdr.dwUser = 0L;
    WaveOutHdr.dwFlags = 0L;
    WaveOutHdr.dwLoops = 1L;

    waveOutPrepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR));

    waveOutSetVolume(hWaveOut, 0xFFFF);

    waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR));

    do{} 
    while(waveOutUnprepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING);
    
    waveOutClose(hWaveOut);


    delete[] waveIn;

    system("pause");
 }

Автор: SVN74 13.7.2014, 22:57
waveOutSetVolume(out, 0xffffffff);

Автор: SVN74 26.7.2014, 16:56
Так и нет ответа. Получилось?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)