95 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
////////////////////////////////////////////////////////////
 | 
						|
// Headers
 | 
						|
////////////////////////////////////////////////////////////
 | 
						|
#include <SFML/Audio.hpp>
 | 
						|
#include <iostream>
 | 
						|
 | 
						|
 | 
						|
////////////////////////////////////////////////////////////
 | 
						|
/// Entry point of application
 | 
						|
///
 | 
						|
/// \return Application exit code
 | 
						|
///
 | 
						|
////////////////////////////////////////////////////////////
 | 
						|
int main()
 | 
						|
{
 | 
						|
    // Check that the device can capture audio
 | 
						|
    if (sf::SoundRecorder::isAvailable() == false)
 | 
						|
    {
 | 
						|
        std::cout << "Sorry, audio capture is not supported by your system" << std::endl;
 | 
						|
        return EXIT_SUCCESS;
 | 
						|
    }
 | 
						|
 | 
						|
    // Choose the sample rate
 | 
						|
    unsigned int sampleRate;
 | 
						|
    std::cout << "Please choose the sample rate for sound capture (44100 is CD quality): ";
 | 
						|
    std::cin  >> sampleRate;
 | 
						|
    std::cin.ignore(10000, '\n');
 | 
						|
 | 
						|
    // Wait for user input...
 | 
						|
    std::cout << "Press enter to start recording audio";
 | 
						|
    std::cin.ignore(10000, '\n');
 | 
						|
 | 
						|
    // Here we'll use an integrated custom recorder, which saves the captured data into a SoundBuffer
 | 
						|
    sf::SoundBufferRecorder recorder;
 | 
						|
 | 
						|
    // Audio capture is done in a separate thread, so we can block the main thread while it is capturing
 | 
						|
    recorder.start(sampleRate);
 | 
						|
    std::cout << "Recording... press enter to stop";
 | 
						|
    std::cin.ignore(10000, '\n');
 | 
						|
    recorder.stop();
 | 
						|
 | 
						|
    // Get the buffer containing the captured data
 | 
						|
    const sf::SoundBuffer& buffer = recorder.getBuffer();
 | 
						|
 | 
						|
    // Display captured sound informations
 | 
						|
    std::cout << "Sound information:" << std::endl;
 | 
						|
    std::cout << " " << buffer.getDuration().asSeconds() << " seconds"           << std::endl;
 | 
						|
    std::cout << " " << buffer.getSampleRate()           << " samples / seconds" << std::endl;
 | 
						|
    std::cout << " " << buffer.getChannelCount()         << " channels"          << std::endl;
 | 
						|
 | 
						|
    // Choose what to do with the recorded sound data
 | 
						|
    char choice;
 | 
						|
    std::cout << "What do you want to do with captured sound (p = play, s = save) ? ";
 | 
						|
    std::cin  >> choice;
 | 
						|
    std::cin.ignore(10000, '\n');
 | 
						|
 | 
						|
    if (choice == 's')
 | 
						|
    {
 | 
						|
        // Choose the filename
 | 
						|
        std::string filename;
 | 
						|
        std::cout << "Choose the file to create: ";
 | 
						|
        std::getline(std::cin, filename);
 | 
						|
 | 
						|
        // Save the buffer
 | 
						|
        buffer.saveToFile(filename);
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        // Create a sound instance and play it
 | 
						|
        sf::Sound sound(buffer);
 | 
						|
        sound.play();
 | 
						|
 | 
						|
        // Wait until finished
 | 
						|
        while (sound.getStatus() == sf::Sound::Playing)
 | 
						|
        {
 | 
						|
            // Display the playing position
 | 
						|
            std::cout << "\rPlaying... " << sound.getPlayingOffset().asSeconds() << " sec        ";
 | 
						|
            std::cout << std::flush;
 | 
						|
 | 
						|
            // Leave some CPU time for other threads
 | 
						|
            sf::sleep(sf::milliseconds(100));
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    // Finished!
 | 
						|
    std::cout << std::endl << "Done!" << std::endl;
 | 
						|
 | 
						|
    // Wait until the user presses 'enter' key
 | 
						|
    std::cout << "Press enter to exit..." << std::endl;
 | 
						|
    std::cin.ignore(10000, '\n');
 | 
						|
 | 
						|
    return EXIT_SUCCESS;
 | 
						|
}
 |