Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[c++] Playsound op specified device.

Pagina: 1
Acties:

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 21:22
Via je Windows API (Winmm) kun je geluiden afspelen via PlaySound(...). Nu heb ik meerdere geluidskaarten in m'n PC en wil ik de geluidskaart kunnen selecteren. Via onderstaande code krijg je een lijst van audio devices.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
WAVEOUTCAPS     woc;

int iNumDevs = waveOutGetNumDevs();

for (int i = 0; i < iNumDevs; i++)
{

    if (!waveOutGetDevCaps(i, &woc, sizeof(WAVEOUTCAPS)))
    {
     
        printf("Device ID #%u: %s\r\n", i, woc.szPname);
    }
}

Hoe selecteer ik nu een specifiek device. Na wat googlen kom ik steed op de functie "waveOutOpen" maar ik kom er niet echt verder mee. Het volgende werkt dus niet:
code:
1
waveOutOpen(&hWaveOut, 1, &waveFormat, NULL, 1, CALLBACK_NULL);

Ik krijg nu helemaal geen geluid meer.

Hoe kan ik een geluidskaart selecteren om geluiden mee af te spelen?

  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

Je hebt uiteraard opgezocht hoe je waveOutOpen hoort aan te roepen ? -> http://msdn.microsoft.com...tm/_win32_waveoutopen.asp

En zo ja, welk gedeelte daarvan heb je problemen mee en wat heb je geprobeerd? :)

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hoe heb je je waveFormat gevuld? Wat geeft waveOutOpen() voor waarde terug?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 21:22
"waveFormat" is waarschijnlijk één van de problemen. Ik heb geen flauw idee wat ik hier in moet vullen. Ik moet informatie van de waveform data hebben. Het enige wat ik heb zijn een aantal wav files die ik af wil spelen. Waarchijnlijk allemaal met andere sample rates e.d. Ik wil (volgens mij) geen ingewikkelde audio toepassing maken, maar gewoon een wav file afspelen via PlaySound. :)

Returnwaarde weet ik even niet. Heb niet de beschikking over de benodigde setup hier. Morgen meer...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Tja, PlaySound speelt nou eenmaal af via de standaard wavemapper, dan kun je simpelweg gewoon geen output device voor kiezen. Als je dat wel wil moet dat met de wave* functies, maar dan zul je zelf het .wav formaat uit moeten pluizen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Adion
  • Registratie: Januari 2001
  • Laatst online: 18:53
Afhankelijk van je project kan je misschien naar de FMod sound engine kijken. Daarmee kan je dit allemaal heel eenvoudig. Toegegeven, het bevat waarschijnlijk veel meer functies dan je nodig hebt, maar het is eenvoudig te gebruiken, gratis voor freeware/eigen gebruik, en vrij goedkoop indien je de enige ontwikkelaar van je project bent.

VirtualDJ 2024 - Fast Image Resizer - Instagram


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 21:22
Mmmm... Het is me allemaal redelijk duidelijk. Als onderdeel van een (klein) predevelopment project gaat het dus niet lukken. Helaas werk ik bij een redelijk groot bedrijf dus voor een sound engine zal ik dus moeten betalen.
Misschien even op de lange baan parkeren totdat ik tijd heb om het wav formaat uit te zoeken...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het wav formaat is niet zo heel erg moeilijk hoor. Ik bedoel, het is dan wel een container (net als bv. .avi), maar je wilt toch slechts een gelimiteerde set aan mogelijke formaten ondersteunen, namelijk gewoon standaard PCM, 8 of 16 bits, mono of stereo (misschien alleen mono), en een samplerate tot zeg 44100Hz. Laat dat nou net allemaal parameters zijn die je ook in die waveformat structure moet stoppen. Vervolgens kun je de inhoud van die .wav direct naar de geluidskaart sturen met waveOutWrite()

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 21:22
Idd. Het lijkt moelijker dan het is.. Voor geinteresseerden:

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
#include "stdafx.h"
#include <windows.h>

#include <iostream>
using namespace std;

#define OFFSET_FORMATTAG        20
#define OFFSET_CHANNELS         22
#define OFFSET_SAMPLESPERSEC    24
#define OFFSET_AVGBYTESPERSEC   28
#define OFFSET_BLOCKALIGN       32
#define OFFSET_BITSPERSAMPLE    34
#define OFFSET_WAVEDATA         44
#define HEADER_SIZE             OFFSET_WAVEDATA

int device = 0;
WAVEFORMATEX wfex;
WAVEHDR whdr;
HWAVEOUT hwo;
void LoadWaveFile(char* fileName)
{
    FILE *f; 
    f = fopen(fileName, "rb");
    if(f)
    {               
        fseek(f, 0, SEEK_END);
        whdr.dwBufferLength = ftell(f);        
        fseek(f, 0, SEEK_SET);

        whdr.lpData = new char [whdr.dwBufferLength];        
        fread(whdr.lpData, 1, whdr.dwBufferLength, f);        
        fclose(f);
    }
    else
    {
        cout << "Error reading file" << endl;
    }
}

bool PlayWave()
{
    bool success = true;
    
    whdr.lpData         += OFFSET_WAVEDATA;     
    whdr.dwBufferLength -= HEADER_SIZE;
    
   int err = waveOutOpen(&hwo, device, &wfex, NULL, 0, CALLBACK_NULL);
   if (err == MMSYSERR_NOERROR)
   {
       err = waveOutPrepareHeader(hwo, &whdr, sizeof(WAVEHDR));
       
       if (err == MMSYSERR_NOERROR)
       {
            err = waveOutWrite(hwo, &whdr, sizeof(WAVEHDR));
            if (err != MMSYSERR_NOERROR) 
            {
               cout << "Error playing file = " <<  err << endl; 
               success = false;
            }
       }
       else
       {
            cout << "Error preparing header file = " <<  err << endl;            
            success = false;
       }

   }
   else
   {
       printf("Error opening wave file = %d", err);
       success = false;
   }
   Sleep(1000);
   return success;
} 

void CloseWave()
{     
    waveOutUnprepareHeader(hwo, &whdr, sizeof(WAVEHDR));
    waveOutClose(hwo);
} 

int _tmain(int argc, _TCHAR* argv[])
{
    WAVEOUTCAPS     woc;
    unsigned long   iNumDevs, i;
     
    iNumDevs = waveOutGetNumDevs();
 
    for (i = 0; i < iNumDevs; i++)
    {
        if (!waveOutGetDevCaps(i, &woc, sizeof(WAVEOUTCAPS)))
        {     
            printf("Device ID #%u: %s\r\n", i, woc.szPname);
        }
    }

    unsigned long err;
    HMIXER        mixerHandle;
    WAVEFORMATEX  waveFormat;
    HWAVEOUT      hWaveOut;
    LoadWaveFile("C:\\WINDOWS\\Media\\chimes.wav");
    wfex.wFormatTag      = *((WORD* )(whdr.lpData + OFFSET_FORMATTAG     ));
    wfex.nChannels       = *((WORD* )(whdr.lpData + OFFSET_CHANNELS      ));
    wfex.nSamplesPerSec  = *((DWORD*)(whdr.lpData + OFFSET_SAMPLESPERSEC ));
    wfex.nAvgBytesPerSec = *((DWORD*)(whdr.lpData + OFFSET_AVGBYTESPERSEC));
    wfex.nBlockAlign     = *((WORD* )(whdr.lpData + OFFSET_BLOCKALIGN    ));
    wfex.wBitsPerSample  = *((WORD* )(whdr.lpData + OFFSET_BITSPERSAMPLE )); 
    if (PlayWave())
    {
        CloseWave();
    }

    return 0;
}

[ Voor 0% gewijzigd door een moderator op 05-10-2007 11:56 . Reden: highlighting maakt het wat leesbaarder :) ]

Pagina: 1