mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 12:52:44 +00:00 
			
		
		
		
	Kernel+Userland: Add option for duration of /dev/beep producing sound
This commit is contained in:
		
							parent
							
								
									1b00618fd9
								
							
						
					
					
						commit
						26f96d2a42
					
				
					 6 changed files with 13 additions and 5 deletions
				
			
		|  | @ -15,6 +15,7 @@ beep allows the user to beep the PC speaker. | |||
| ## Options | ||||
| 
 | ||||
| * `-f frequency`, `--beep-tone frequency`: Beep tone (frequency in Hz) | ||||
| * `-n N`, `--duration N`: Duration (N in milliseconds) | ||||
| 
 | ||||
| ## Notes | ||||
| 
 | ||||
|  | @ -28,6 +29,8 @@ will fail to use the PC speaker. | |||
| $ beep | ||||
| # Use beep with tone of 1000Hz | ||||
| $ beep -f 1000 | ||||
| # Use beep with tone of 1000Hz for 1 second | ||||
| $ beep -f 1000 -n 1000 | ||||
| ``` | ||||
| 
 | ||||
| ## See also | ||||
|  |  | |||
|  | @ -10,4 +10,5 @@ | |||
| 
 | ||||
| struct BeepInstruction { | ||||
|     u16 tone; | ||||
|     u16 milliseconds_duration; | ||||
| }; | ||||
|  |  | |||
|  | @ -48,9 +48,11 @@ ErrorOr<size_t> PCSpeakerDevice::write(OpenFileDescription&, u64, UserOrKernelBu | |||
|     TRY(buffer.read(&instruction, sizeof(BeepInstruction))); | ||||
|     if (instruction.tone < 20 || instruction.tone > 20000) | ||||
|         return Error::from_errno(EINVAL); | ||||
|     if (instruction.milliseconds_duration == 0) | ||||
|         return Error::from_errno(EINVAL); | ||||
| #if ARCH(X86_64) | ||||
|     PCSpeaker::tone_on(instruction.tone); | ||||
|     auto result = Thread::current()->sleep(Duration::from_nanoseconds(200'000'000)); | ||||
|     auto result = Thread::current()->sleep(Duration::from_milliseconds(instruction.milliseconds_duration)); | ||||
|     PCSpeaker::tone_off(); | ||||
|     if (result.was_interrupted()) | ||||
|         return Error::from_errno(EINTR); | ||||
|  |  | |||
|  | @ -149,12 +149,12 @@ namespace Core::System { | |||
| 
 | ||||
| #ifdef AK_OS_SERENITY | ||||
| 
 | ||||
| ErrorOr<void> beep(u16 tone) | ||||
| ErrorOr<void> beep(u16 tone, u16 milliseconds_duration) | ||||
| { | ||||
|     static Optional<int> beep_fd; | ||||
|     if (!beep_fd.has_value()) | ||||
|         beep_fd = TRY(Core::System::open("/dev/beep"sv, O_RDWR)); | ||||
|     BeepInstruction instruction { tone }; | ||||
|     BeepInstruction instruction { tone, milliseconds_duration }; | ||||
|     TRY(Core::System::write(beep_fd.value(), Span<u8 const>(&instruction, sizeof(BeepInstruction)))); | ||||
|     return {}; | ||||
| } | ||||
|  |  | |||
|  | @ -51,7 +51,7 @@ | |||
| namespace Core::System { | ||||
| 
 | ||||
| #ifdef AK_OS_SERENITY | ||||
| ErrorOr<void> beep(u16 tone = 440); | ||||
| ErrorOr<void> beep(u16 tone = 440, u16 milliseconds_duration = 200); | ||||
| ErrorOr<void> pledge(StringView promises, StringView execpromises = {}); | ||||
| ErrorOr<void> unveil(StringView path, StringView permissions); | ||||
| ErrorOr<void> unveil_after_exec(StringView path, StringView permissions); | ||||
|  |  | |||
|  | @ -11,9 +11,11 @@ | |||
| ErrorOr<int> serenity_main(Main::Arguments arguments) | ||||
| { | ||||
|     Optional<size_t> tone; | ||||
|     Optional<size_t> milliseconds_duration; | ||||
|     Core::ArgsParser args_parser; | ||||
|     args_parser.add_option(tone, "Beep tone", "beep-tone", 'f', "Beep tone (frequency in Hz)"); | ||||
|     args_parser.add_option(milliseconds_duration, "Duration", "duration", 'n', "Duration (in milliseconds)"); | ||||
|     args_parser.parse(arguments); | ||||
|     TRY(Core::System::beep(tone.value_or(440))); | ||||
|     TRY(Core::System::beep(tone.value_or(440), milliseconds_duration.value_or(200))); | ||||
|     return 0; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Liav A
						Liav A