![]() |
|
Audio seems overly complicated :( |
bamccaig
Member #7,536
July 2006
![]() |
Edgar Reynaldo said: Piano.zip has the source, media, and binary I made that shows this. Thanks. That is working much better in Windows (assuming by Piano.zip you meant BCPiano.zip). I haven't tried playing with the driver options in Linux yet. The source code in the zip appears to be the fancy, low-level version. Did the original version work too? Quote: Attached is your second program, with the modifications I mentioned. It appears all you changed was the depth and then hard-coded filenames instead of generating them. I assume is should also work with the default voice and mixer, but did you try it? Quote: So it seems you can still attach sample instances to the mixer created by al_reserve_samples, regardless of the number of instances you reserve. I used al_reserve_samples(1) and attached multiple sample instances and they all played without distortion or dropping out. My guess without trying to make sense of the code is that al_reserve_samples() is setting up a pool of a fixed size based on what you specify, and it automatically will use that to allocate instances from. As far as I've come across, I don't know of a limitation to the number of things that can be attached to a mixer. Though I'm also not sure if there are quality or performance limitations as a result. I assume there must be, or again, a "simple" API that hides all of these shenanigans should be braindead simple to wire up.. -- acc.js | al4anim - Allegro 4 Animation library | Allegro 5 VS/NuGet Guide | Allegro.cc Mockup | Allegro.cc <code> Tag | Allegro 4 Timer Example (w/ Semaphores) | Allegro 5 "Winpkg" (MSVC readme) | Bambot | Blog | C++ STL Container Flowchart | Castopulence Software | Check Return Values | Derail? | Is This A Discussion? Flow Chart | Filesystem Hierarchy Standard | Clean Code Talks - Global State and Singletons | How To Use Header Files | GNU/Linux (Debian, Fedora, Gentoo) | rot (rot13, rot47, rotN) | Streaming |
Edgar Reynaldo
Major Reynaldo
May 2007
![]() |
bamccaig said: assuming by Piano.zip you meant BCPiano.zip No, I meant Piano.zip, the link was broken. It's fixed now. That contains the first modified version you used. bamccaig said: I assume is should also work with the default voice and mixer, but did you try it? Yes, it worked fine. bamccaig said: a "simple" API that hides all of these shenanigans should be braindead simple to wire up.. I want to know what exactly you mean. Write out the function prototypes you would expect a "simple" API to have. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
Izual
Member #2,756
September 2002
![]() |
bamccaig, here is my edited version of your piano using VOICE / MIXER / SAMPLE INSTANCES: ZIP with source and all files here. 1#include <allegro5/allegro.h>
2#include <allegro5/allegro_acodec.h>
3#include <allegro5/allegro_audio.h>
4#include <allegro5/allegro_font.h>
5#include <allegro5/allegro_ttf.h>
6#include <stdio.h>
7#include <stdlib.h>
8
9#define notes_length ( sizeof( note_s ) / sizeof( ALLEGRO_SAMPLE * ) )
10
11#define say_center(w, h, text) \
12 (al_draw_text(musicals, white, w, h, ALLEGRO_ALIGN_CENTRE, text))
13
14void play_note( ALLEGRO_SAMPLE_INSTANCE *si )
15{
16 /*
17 Setting position just to skip the silence at the start of the notes.
18 Why 32000 ? Because it sounds just right to me. Try more or less and see.
19 */
20 al_set_sample_instance_position( si, 32000 );
21 al_set_sample_instance_playing( si, true );
22}
23
24static const char abcdefg[] = "abcdefg";
25
26int main(int argc, char * argv[])
27{
28 char tmp[8] = " ";
29 int i = 0, l = -1;
30 int status = 0;
31 ALLEGRO_COLOR black, white;
32 ALLEGRO_DISPLAY * display = NULL;
33 ALLEGRO_EVENT_QUEUE * event_queue = NULL;
34 ALLEGRO_FONT * musicals = NULL;
35 ALLEGRO_TIMEOUT timeout;
36 ALLEGRO_VOICE *voice = NULL;
37 ALLEGRO_MIXER *mixer = NULL;
38 ALLEGRO_SAMPLE *note_s[ 7 ] = { 0 };
39 ALLEGRO_SAMPLE_INSTANCE *note_si[ 7 ] = { 0 };
40
41 if (!al_init())
42 {
43 fprintf(stderr, "al_init failed\n");
44 goto error;
45 }
46 if (!al_install_keyboard())
47 {
48 fprintf(stderr, "al_install_keyboard failed\n");
49 goto error;
50 }
51 if (!al_install_audio())
52 {
53 fprintf(stderr, "al_install_audio failed\n");
54 goto error;
55 }
56 if (!al_init_acodec_addon())
57 {
58 fprintf(stderr, "al_init_acodec_addon failed\n");
59 goto error;
60 }
61 if (!al_init_font_addon())
62 {
63 fprintf(stderr, "al_init_font_addon failed\n");
64 goto error;
65 }
66 if (!al_init_ttf_addon())
67 {
68 fprintf(stderr, "al_init_ttf_addon failed\n");
69 goto error;
70 }
71 display = al_create_display(1440, 900);
72 if (display == NULL)
73 {
74 fprintf(stderr, "al_create_display failed\n");
75 goto error;
76 }
77 event_queue = al_create_event_queue();
78 if (event_queue == NULL)
79 {
80 fprintf(stderr, "al_create_event_queue failed\n");
81 goto error;
82 }
83
84 /* Setup sound: */
85 voice = al_create_voice( 44100,
86 ALLEGRO_AUDIO_DEPTH_INT16,
87 ALLEGRO_CHANNEL_CONF_2 );
88 if( !voice )
89 {
90 fprintf(stderr, "al_create_voice failed\n");
91 goto error;
92 }
93 mixer = al_create_mixer( 44100,
94 ALLEGRO_AUDIO_DEPTH_INT16,
95 ALLEGRO_CHANNEL_CONF_2 );
96 if( !mixer )
97 {
98 fprintf(stderr, "al_create_mixer failed\n");
99 goto error;
100 }
101 al_attach_mixer_to_voice( mixer, voice );
102
103 /* Load note samples: */
104 for( i=0, l=notes_length; i<l; i++ )
105 {
106 char filename[22] = "media/Piano.ff.A3.ogg";
107 filename[15] = 'A' + i;
108 if (filename[15] > 'B')
109 {
110 filename[16] = '4';
111 }
112 note_s[ i ] = al_load_sample( filename );
113 if( note_s[ i ] == NULL )
114 {
115 fprintf(stderr, "al_load_sample %s failed\n", filename);
116 goto error;
117 }
118
119 /* Create our sample instances: */
120 note_si[ i ] = al_create_sample_instance( note_s[ i ] );
121 if( note_si[ i ] == NULL )
122 {
123 fprintf( stderr, "al_create_sample_instance %s failed\n", filename );
124 goto error;
125 }
126 /* And attach them to the mixer: */
127 al_attach_sample_instance_to_mixer( note_si[ i ], mixer );
128 }
129
130 musicals = al_load_ttf_font("musicals.ttf", 72, 0);
131 if (musicals == NULL)
132 {
133 fprintf(stderr, "al_load_ttf_font failed\n");
134 goto error;
135 }
136 al_register_event_source(event_queue, al_get_display_event_source(display));
137 al_register_event_source(event_queue, al_get_keyboard_event_source());
138 black = al_map_rgb(0, 0, 0);
139 white = al_map_rgb(255, 255, 255);
140 al_init_timeout( &timeout, 0.06);
141
142 while (1)
143 {
144 int w = al_get_display_width(display);
145 int h = al_get_display_height(display);
146 ALLEGRO_EVENT ev;
147 if (al_wait_for_event_until(event_queue, &ev, &timeout) )
148 {
149 switch (ev.type)
150 {
151 case ALLEGRO_EVENT_DISPLAY_CLOSE:
152 goto clean;
153 break;
154 case ALLEGRO_EVENT_KEY_DOWN:
155 if (ev.keyboard.keycode >= ALLEGRO_KEY_A && ev.keyboard.keycode <= ALLEGRO_KEY_G)
156 {
157 i = ev.keyboard.keycode - ALLEGRO_KEY_A;
158 tmp[ i ] = abcdefg[ i ];
159
160 play_note( note_si[ i ] );
161 }
162 else
163 {
164 switch (ev.keyboard.keycode)
165 {
166 case ALLEGRO_KEY_ESCAPE:
167 case ALLEGRO_KEY_Q:
168 goto clean;
169 }
170 }
171 break;
172 case ALLEGRO_EVENT_KEY_UP:
173 if (ev.keyboard.keycode >= ALLEGRO_KEY_A && ev.keyboard.keycode <= ALLEGRO_KEY_G)
174 {
175 i = ev.keyboard.keycode - ALLEGRO_KEY_A;
176
177 tmp[ i ] = ' ' ;
178 /*
179 Uncomment to make the sample instance stop playing on
180 key up event. Does not sound good to me:
181 */
182 /*
183 al_set_sample_instance_playing( note_si[ i ], false );
184 */
185 }
186 break;
187 }
188 }
189 al_clear_to_color(black);
190
191 say_center(w / 2.0, h / 2.0, "abcdefg ABCDEFG");
192 say_center(w / 2.0, h / 2.0 + 100, tmp);
193
194 al_flip_display();
195 }
196clean:
197 for ( i=0, l=notes_length; i<l; i++ )
198 {
199 if( note_si[ i ] )
200 al_destroy_sample_instance( note_si[ i ] );
201 if( note_s[ i ] )
202 al_destroy_sample( note_s[ i ] );
203 }
204
205 if (musicals) al_destroy_font(musicals);
206
207 if( mixer ) al_destroy_mixer( mixer );
208 if( voice ) al_destroy_voice( voice );
209
210 if (event_queue) al_destroy_event_queue(event_queue);
211 if (display) al_destroy_display(display);
212 return status;
213error:
214 status = 1;
215 goto clean;
216}
|
bamccaig
Member #7,536
July 2006
![]() |
Thanks. I think Edgar and I already accomplished that. What remains is for me to test whether it's the data files or the driver causing my issue. I haven't had time to do that yet.. So bump.. -- acc.js | al4anim - Allegro 4 Animation library | Allegro 5 VS/NuGet Guide | Allegro.cc Mockup | Allegro.cc <code> Tag | Allegro 4 Timer Example (w/ Semaphores) | Allegro 5 "Winpkg" (MSVC readme) | Bambot | Blog | C++ STL Container Flowchart | Castopulence Software | Check Return Values | Derail? | Is This A Discussion? Flow Chart | Filesystem Hierarchy Standard | Clean Code Talks - Global State and Singletons | How To Use Header Files | GNU/Linux (Debian, Fedora, Gentoo) | rot (rot13, rot47, rotN) | Streaming |
Niunio
Member #1,975
March 2002
![]() |
Sorry for the late answer but: Edgar Reynaldo said: This is why nothing ever gets done. I hope somebody updated the docs for me... You're right, but I'm Spanish and English is quite bad when I try to explain complex things (it really is); that's why I don do it. Anyway I have to read again this thread carefully to see if I learn more. ----------------- |
Edgar Reynaldo
Major Reynaldo
May 2007
![]() |
Bump so Eric can try out the piano program. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
Eric Johnson
Member #14,841
January 2013
![]() |
Thanks for the bump. It's a cool little piano program. I'm on Linux, so I had to run it in Wine. It's probably just a Wine issue, but it took about a second between the time I pressed a key and the time the sound began. I'll try it in Windows when I get the chance.
|
bamccaig
Member #7,536
July 2006
![]() |
Eric, you could also just try building the program yourself in Linux. -- acc.js | al4anim - Allegro 4 Animation library | Allegro 5 VS/NuGet Guide | Allegro.cc Mockup | Allegro.cc <code> Tag | Allegro 4 Timer Example (w/ Semaphores) | Allegro 5 "Winpkg" (MSVC readme) | Bambot | Blog | C++ STL Container Flowchart | Castopulence Software | Check Return Values | Derail? | Is This A Discussion? Flow Chart | Filesystem Hierarchy Standard | Clean Code Talks - Global State and Singletons | How To Use Header Files | GNU/Linux (Debian, Fedora, Gentoo) | rot (rot13, rot47, rotN) | Streaming |
Eric Johnson
Member #14,841
January 2013
![]() |
Done. I built it from Piano.zip, but nothing happened when I pressed the keys. Then I tried Izual's edit and it worked. It works flawlessly without delay, so the audio issues were Wine's fault.
|
AramisL
Member #16,723
August 2017
![]() |
Hi bamccaig, as Edgar mentioned, as my little doubt too, have you noticed that the keyboards have hardware limitations? I mean, it depends on the builder of your keyboard HOW MANY buttons can be pressed at a time, it is called buffer keyboard and this is related with memory and bus in the hardware (and I dont know if OS too, that's why audio cards does exists, aren't they?) my little grand of sand |
bamccaig
Member #7,536
July 2006
![]() |
I am using a DAS KEYBOARD so my keyboard should support N-key input. -- acc.js | al4anim - Allegro 4 Animation library | Allegro 5 VS/NuGet Guide | Allegro.cc Mockup | Allegro.cc <code> Tag | Allegro 4 Timer Example (w/ Semaphores) | Allegro 5 "Winpkg" (MSVC readme) | Bambot | Blog | C++ STL Container Flowchart | Castopulence Software | Check Return Values | Derail? | Is This A Discussion? Flow Chart | Filesystem Hierarchy Standard | Clean Code Talks - Global State and Singletons | How To Use Header Files | GNU/Linux (Debian, Fedora, Gentoo) | rot (rot13, rot47, rotN) | Streaming |
Izual
Member #2,756
September 2002
![]() |
@Eric: The delay in the sound is propably not Wines fault. The samples contain about a second of silence at the start. This line in my edit: al_set_sample_instance_position( si, 32000 ); skips about a second of that silence and makes it sounds about right. And one more thing. When you use al_set_sample_instance_playing( sample_instance, true ); more then once on one sample instance, it will not start playing the sample form the start. I will just keep playing. The sample instance position is reset to the start ( 0 ) when it is finished playing or when it is stopped.
|
Eric Johnson
Member #14,841
January 2013
![]() |
Izual said: @Eric: The delay in the sound is propably not Wines fault. The samples contain about a second of silence at the start. Oh that's it then. I do know I've had audio issues with Wine in the past though.
|
GullRaDriel
Member #3,861
September 2003
![]() |
Bump "Code is like shit - it only smells if it is not yours" |
Michael Weiss
Member #223
April 2000
|
Just thought I'd add my two cents here. I have used the old allegro 4 sound routine and have just ported to the new I had no problems, except for a small misunderstanding when I tried to hook So now a have voice -> mixer -> two other mixers. One of them I have connected to all my sound effects and the other one is I personally do not think the api is overly complicated. I read the comments Just my two cents worth...
|
|
|